Como o alias do bash entende “$ @”?

1

Estou tentando escrever um alias para fazer duas coisas

$alias cde='cd "$@" && echo'

mas, por algum motivo, quando o chamo com

$cde test
test

tudo o que acontece é o teste de echos:

Parece que meu argumento não está sendo passado para a primeira instrução e, em vez disso, está sendo usado no final de todo o alias. Pelo que entendi, o $@ deveria consumir todos os argumentos para que nunca alcançasse o eco. De alguma forma eu posso usar um argumento na primeira parte, e não o segundo?

    
por Sepehr Nazari 22.09.2017 / 08:38

1 resposta

5

O alias não aceita argumentos. Ele simplesmente substitui uma string pela outra na sua linha de comando. Não há $@ separado para um alias, portanto, "$@" não se expande como esperado aqui. Ele se expande como se você digitasse diretamente em sua linha de comando (manualmente):

echo "$@"

(Isso não mostra a divisão exata da palavra, mas não é o ponto).

No entanto, uma função recebe argumentos e possui seu próprio $@ . Não está claro para mim se você queria que o echo imprimisse seus alias "argumentos". Se assim for, eu faria isso em vez de um alias:

cde() { cd "$@" ; echo "$@" ; }

Ou melhor:

cde() { cd "$@" ; pwd ; }

A diferença está em lidar com vários argumentos, expandir caminhos como .. etc. Também -L e -P opções para pwd podem ser úteis.

Se você desejar substituir cd , precisará de command para evitar o loop infinito (a função poderia se chamar de outra forma):

cd() { command cd "$@" ; pwd ; }
    
por 22.09.2017 / 09:08