O uso "$@"
passará todos os argumentos para cd
onde como $1
passará apenas o primeiro argumento.
Nos seus exemplos
$ . cdtest.sh "r st"
sempre funciona como você passa apenas em um argumento, mas se você passar uma bandeira também, como
$ . cdtest.sh -L "r st"
Só "$@"
será executado corretamente onde "$1"
será expandido, cd -L
perdendo o diretório completamente.
Contudo
$ . cdtest.sh r st
Falha nos dois casos, pois você está passando dois parâmetros para o cd r
e st
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.
cd "$*"
também não funcionará corretamente com mais de 1 argumento.