Como trocar dois comandos no bash?

4

Digamos que eu tenha o comando A e o comando B , mas quero que B seja executado quando digito A e vice-versa. Eu tentei

alias A='B'
alias B='A'

Mas isso não parece funcionar por algum motivo.

Como faço isso?

EDITAR:

O comando B foi definido como uma função no meu .bashrc , então

alias A='command B'
alias B='command A'

não funciona como sugerido.

Acho que eu poderia atualizar a pergunta para dizer que A e B também podem ser funções definidas no bash.

    
por texasflood 01.03.2015 / 13:00

1 resposta

5

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 a ls -F , por exemplo, e bash 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.

    
por 01.03.2015 / 13:36

Tags