Como posso ver qual comando foi realmente executado no shell, por meio de um alias ou função

20

Eu tenho uma função bash (ou alias), por exemplo function install() {sudo apt-get install $@} . Ao executar o comando install dicelab , o que eu espero que seja realmente executado é sudo apt-get install dicelab . Onde posso ver o que foi realmente executado pelo shell? Eu gostaria de ter certeza de que meus aliases mais complicados estão funcionando como esperado.

    
por Alon Aviv 04.05.2017 / 09:30

3 respostas

29

Use set -x no shell.

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

Usar set -x ativa a opção xtrace shell ( set +x a desativa) e deve funcionar em todos os shells semelhantes a Bourne, como bash , dash ksh93 , pdksh e% código%. Isso faz com que o shell exiba o comando executado após as expansões de alias e as expansões de variáveis, etc. que foram executadas.

A saída estará no fluxo de erro padrão do shell (assim como o prompt comum) para não interferir nos redirecionamentos da saída padrão, e será precedido por um prompt conforme definido pela variável zsh shell ( PS4 por padrão).

Exemplo com algumas funções:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

Estou correndo com +␣ em todos os meus shells interativos por padrão. É legal ver o que realmente foi executado ... mas notei que a conclusão de tabulação programável, etc., pode causar saída de rastreamento indesejada em alguns shells.

    
por 04.05.2017 / 09:36
14

Você pode usar shell-expand-line , que é obrigado a Controlar - Alt - e por omissão:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

Entre outras coisas, ele substituirá os aliases na linha atual por sua definição, para que você possa ver um comando para o qual ainda está indo para executar. Exemplo:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this
    
por 04.05.2017 / 09:49
0

Você pode usar o bash builtin type para ver um alias ou uma definição de função que você irá executar:

$ type ls
ls is aliased to 'ls --color=auto -p'

$ type -a ls
ls is aliased to 'ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
    
por 08.05.2017 / 13:44