Assim, você pode ficar explícito sobre a maneira como o shell executa a localização de comandos de algumas maneiras diferentes. Você pode usar ...
command command_name
... para instruir o shell apenas para invocar o nome_do_comando se ele for um executável $PATH
d. Isso é importante em casos como o seu porque, quando você termina, alias A
refere-se a alias B
, que se refere a alias A
, em geral 20 vezes antes de a expansão alias
ser recursiva. começado. Se você quisesse definitivamente invocar apenas um $PATH
d executável B
ao chamar A
e vice-versa, você pode fazer ...
alias A='command B' B='command A'
... o que deve evitar até chamar funções denominadas A
ou B
. Caso contrário - porque o shell não expandirá um alias
citado como um alias
, mas ainda chamará uma função mesmo se o nome_do_comando estiver entre aspas, você poderá citar A
e B
nas definições como ...
alias A=\B B=\A
Ok, então ele não recapitula vinte vezes. Eu poderia jurar que tinha lido isso em alguma página de man
, mas acho que pelo menos não é verdade de bash
ou ksh
(tendo testado apenas um deles até agora) . De fato, recorre apenas duas vezes:
n=0
A(){ echo not B; n=0; }
B(){ echo not A; n=0; }
alias A='echo "$((n+=1))";B' B='echo "$((n+=1))";A'
Se eu fizer o que precede e fizer ...
A
... em bash
imprime:
1
2
not B
Acho que isso é relevante para isso no manual bash
:
- A primeira palavra do texto de substituição é testada para aliases, mas uma palavra que é idêntica a um alias sendo expandido não é expandida uma segunda vez. Isso significa que um pode alias
ls
als -F
, por exemplo, ebash
não tenta expandir recursivamente o texto de substituição.
Eu já tinha lido isso antes, mas não achei que seria possível testar todas as expansões que levaram à expansão atual ao fazer isso - imaginei que isso se aplicaria apenas à mais recente expansão da cadeia. De qualquer forma, parece que é por isso.
Eu notei um comportamento interessante. Depois que eu já havia declarado os aliases e as funções, fui reexecutar os comandos, mas com um espaço em branco um pouco menos interveniente - assim:
A(){ echo not B; }; B(){ echo not A; }; A; B
... e isso fez ...
1
2
3
4
5
6
not B
7
8
not A
O que significa que o shell substituiu o conteúdo do alias pelo nome da função - que não é uma posição que normalmente poderia esperar que uma expansão ocorresse - fez o echo
se ainda foi redefinido e executado? As funções.