Em outros lugares, vi uma função cd como abaixo:
cd()
{
builtin cd "$@"
}
por que é recomendado usar em $@
vez de $1
?
Eu criei um diretório de teste "r st" e chamei o script que contém esta função e funcionou de qualquer maneira
$ . cdtest.sh "r st"
mas $ . cdtest.sh r st
falhei se eu usei "$@"
ou"$1"
cd "$*"
também não funcionará corretamente com mais de 1 argumento.Respostas:
Porque, de acordo com
bash(1)
,cd
leva argumentosportanto, o diretório realmente pode não estar,
$1
pois isso poderia ser uma opção como-L
outra bandeira.Quão ruim é isso?
As coisas podem dar errado se você não chegar onde espera usar
cd "$1"
…fonte
O uso
"$@"
passará todos os argumentos paracd
onde como$1
passará apenas o primeiro argumento.Nos seus exemplos
sempre funciona como você passa apenas em um argumento, mas se você passar uma bandeira também, como
Só
"$@"
será executado corretamente onde"$1"
será expandido,cd -L
perdendo o diretório completamente.Contudo
Falha nos dois casos, pois você está passando dois parâmetros para o cd
r
est
não é uma maneira válida de executar o cd. Os parâmetros são separados por espaços que devem ser citados (como no seu primeiro exemplo) ou escapados (r\ st
) para serem tratados como um argumento.No caso do cd, no entanto, é muito incomum passar sinalizadores e você não pode passar em vários diretórios; portanto, você não verá a diferença no uso no mundo real de um
"$1"
ou"$@"
de outro. Mas para outros comandos que você vai notar uma diferença, por isso é melhor prática para usar sempre"$@"
quando você quer criar uma função wrapper ou script como este.fonte
Também existe o caso em que não há argumentos:
cd
sem nenhum argumento muda para o diretório inicial. Sem argumentos, não se"$@"
expande para nada, mas se"$1"
expande para a cadeia vazia. Estes são diferentes:fonte
cd
é uma coisa boa. Causa um erro em vez de mudar para o diretório inicial. Com alguns outros comandos, notavelmentersync
, um primeiro argumento nulo causa comportamento inesperado (inclui o diretório atual nas fontes da transferência).Os argumentos para um script bash são delimitados por espaço. $ 1 é o primeiro argumento. Nos seus exemplos ...
No exemplo 1, $ 1 é a sequência "r st" ... no segundo exemplo, $ 1 é a sequência de um caractere 'r' ...
$ @ são todos os argumentos.
fonte