El uso "$@"pasará todos los argumentos a cddonde como $1solo 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 -Lperder el directorio por completo.
sin embargo
$ . cdtest.sh r st
Falla en ambos casos ya que está pasando dos parámetros a cd, ry stque 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.