El uso "$@"
pasará todos los argumentos a cd
donde como $1
solo pasará el primer argumento.
En tus ejemplos
$ . cdtest.sh "r st"
siempre funciona ya que solo pasa un argumento, pero si pasara una bandera también, como
$ . cdtest.sh -L "r st"
Entonces solo "$@"
se ejecutará correctamente donde "$1"
se expandirá a cd -L
perder el directorio por completo.
sin embargo
$ . cdtest.sh r st
Falla en ambos casos ya que está pasando dos parámetros a cd, r
y st
que no es una forma válida de ejecutar cd. Los parámetros están separados por espacios que deben citarse (como en su primer ejemplo) o escapar ( r\ st
) para ser tratados como un argumento.
En el caso de cd, sin embargo, es muy raro pasar banderas y no puede pasar en múltiples directorios, por lo que no verá la diferencia en el uso en el mundo real de "$1"
o "$@"
para cd. Pero para otros comandos , notará una diferencia, por lo que es una buena práctica usar siempre "$@"
que desee crear una función de envoltura o un script como este.
cd "$*"
tampoco funcionará correctamente con más de 1 arg.