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 realmente foi executado pelo shell? Gostaria de garantir que meus aliases mais complicados estejam funcionando conforme o esperado.

Alon Aviv
fonte
Isso faz $@parte do seu apelido? Lembre-se de que os aliases não suportam argumentos, que serão expandidos para os parâmetros posicionais (se houver) do contexto que chama o alias. A maneira usual de executar somealias some argsfunciona apenas expandindo o alias e deixando os argumentos para segui-lo. Se você realmente quer ser capaz de acessar os argumentos, use uma função, e citar o"$@"
ilkkachu
2
Possível duplicado da Resolve aninhados aliases aos seus comandos de origem
darkheart
11
@AlonAviv, Good. :) Ainda assim, é melhor ter o hábito de citar que "$@", argumentos com caracteres de espaço em branco ou glob serão queimados de outra forma.
Ilkkachu
11
@DarkHeart Isso não é duplicado. A outra questão não está relacionada às funções do shell.
Kusalananda
2
Nem foi este até que foi editado para mudar completamente de assunto (e invalidar uma das respostas existentes).
Michael Homer

Respostas:

29

Use set -xno shell.

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

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

Usando set -xvoltas na xtraceopção de shell ( set +xdesliga) e deve funcionar em todos Bourne-como conchas, como bash, dash ksh93, pdkshe zsh. Isso solicita que o shell exiba o comando que é executado após a execução de expansões de alias e expansões variáveis ​​etc.

A saída estará no fluxo de erros padrão do shell (assim como no prompt comum), para que não interfira nos redirecionamentos da saída padrão e será precedida por um prompt, conforme definido pela PS4variável do shell ( +␣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 executando com set -xtodas as minhas conchas interativas por padrão. É bom ver o que realmente foi executado ... mas notei que a conclusão de guias programáveis ​​etc. pode causar saída de rastreamento indesejada em alguns shells.

Kusalananda
fonte
14

Você poderia usar shell-expand-line, que está vinculado a Control- Alt- epor padrão:

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

Entre outras coisas, ele irá substituir aliases na linha atual com a sua definição para que você possa ver um comando que 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
Arkadiusz Drabczyk
fonte
esse é um ótimo recurso. você sabe se o zsh tem um comando equivalente shell-expand-line?
the_velour_fog 4/17
Desculpe, não porque não uso zsh. Mas algumas pessoas vêm-se com as suas próprias ideias: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Arkadiusz Drabczyk
@the_velour_fog, consulte Resolver todos os aliases em uma linha de comando zsh
Stéphane Chazelas
1

Você pode usar o bash built- typein 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 "@"
}
Belkka
fonte