Ailleurs, j'ai vu une fonction cd comme ci-dessous:
cd()
{
builtin cd "$@"
}
pourquoi est-il recommandé d'utiliser à la $@
place de $1
?
J'ai créé un répertoire de test "r st" et appelé le script contenant cette fonction et cela a fonctionné de toute façon
$ . cdtest.sh "r st"
mais a $ . cdtest.sh r st
échoué si j'ai utilisé "$@"
ou"$1"
cd "$*"
ne fonctionnera pas non plus correctement avec plus de 1 argument.Réponses:
Parce que, selon
bash(1)
,cd
prend des argumentspar conséquent, le répertoire peut ne pas être en fait
$1
car cela pourrait plutôt être une option telle que-L
ou un autre indicateur.Est-ce grave?
Les choses pourraient mal tourner si vous ne vous retrouvez pas là où vous vous attendez à utiliser
cd "$1"
…la source
L'utilisation
"$@"
passera tous les arguments àcd
où as$1
ne passera que le premier argument.Dans vos exemples
fonctionne toujours car vous ne passez qu’un seul argument, mais si vous deviez également passer un indicateur tel que
Ensuite, seul
"$@"
s'exécutera correctement où"$1"
se développera pourcd -L
perdre entièrement le répertoire.toutefois
Ne parvient pas dans les deux cas que vous passez deux paramètres au CD,
r
etst
qui n'est pas un moyen valable pour exécuter cd. Les paramètres sont séparés par des espaces qui doivent être entre guillemets (comme dans votre premier exemple) ou escaped (r\ st
) pour être traités comme un seul argument.Dans le cas de cd, cependant, il est très rare de passer des drapeaux et vous ne pouvez pas passer dans plusieurs répertoires, vous ne verrez donc pas la différence dans une utilisation réelle de l'un
"$1"
ou de l'autre"$@"
pour le cd. Mais pour d' autres commandes que vous aurez remarqué une différence il est donc préférable d'utiliser toujours"$@"
lorsque vous souhaitez créer une fonction d'emballage ou d'un script comme celui - ci.la source
Il y a aussi le cas quand il n'y a pas d' arguments:
cd
sans aucun argument, modification du répertoire personnel. Sans aucun argument, se"$@"
développe à rien, mais se"$1"
développe à la chaîne vide. Ce sont différents:la source
cd
est une bonne chose. Il provoque une erreur au lieu de passer au répertoire personnel. Avec certaines autres commandes, notammentrsync
, un premier argument nul provoque un comportement inattendu (inclut le répertoire courant dans les sources du transfert).Les arguments d'un script bash sont séparés par des espaces. $ 1 est le premier argument. Dans vos exemples ...
Dans l'exemple 1, $ 1 est la chaîne "r st" ... dans le deuxième exemple, $ 1 est la chaîne de caractères "r" ...
$ @ est tous les arguments.
la source