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 st
falló si usé "$@"
o"$1"
cd "$*"
tampoco funcionará correctamente con más de 1 arg.Respuestas:
Porque, según
bash(1)
,cd
toma argumentospor lo tanto, el directorio en realidad puede no estar
$1
ya que podría ser una opción como-L
u 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 acd
donde como$1
solo 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 -L
perder el directorio por completo.sin embargo
Falla en ambos casos ya que está pasando dos parámetros a cd,
r
yst
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.fuente
También está el caso cuando no hay argumentos:
cd
sin 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
cd
es 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