En otros lugares he visto una función de CD como se muestra a continuación:
cd()
{
builtin cd "$@"
}
¿Por qué se recomienda usar en $@lugar de $1?
Creé un directorio de prueba "r st" y llamé al script que contiene esta función y funcionó de cualquier manera
$ . cdtest.sh "r st"
pero $ . cdtest.sh r stfalló si usé "$@"o"$1"

cd "$*"tampoco funcionará correctamente con más de 1 arg.Respuestas:
Porque, según
bash(1),cdtoma argumentospor lo tanto, el directorio en realidad puede no estar
$1ya que podría ser una opción como-Lu otra bandera.¿Qué tan malo es esto?
Las cosas podrían salir muy mal si no terminas donde esperas usar
cd "$1"...fuente
El uso
"$@"pasará todos los argumentos acddonde como$1solo pasará el primer argumento.En tus ejemplos
siempre funciona ya que solo pasa un argumento, pero si pasara una bandera también, como
Entonces solo
"$@"se ejecutará correctamente donde"$1"se expandirá acd -Lperder el directorio por completo.sin embargo
Falla en ambos casos ya que está pasando dos parámetros a cd,
rystque 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.fuente
También está el caso cuando no hay argumentos:
cdsin ningún argumento cambia al directorio de inicio. Sin ningún argumento, se"$@"expande a nada, pero se"$1"expande a la cadena vacía. Estos son diferentes:fuente
cdes bueno. Causa un error en lugar de cambiar al directorio de inicio. Con algunos otros comandos, en particularrsync, un primer argumento nulo provoca un comportamiento inesperado (incluye el directorio actual en las fuentes de la transferencia).Los argumentos de un script bash están delimitados por espacios. $ 1 es el primer argumento. En tus ejemplos ...
En el ejemplo 1, $ 1 es la cadena "r st" ... en el segundo ejemplo, $ 1 es la cadena de caracteres 'r' ...
$ @ es todos los argumentos.
fuente