Dans ce tutoriel nous devons exécuter la commande suivante:
# curl -sL https://rpm.nodesource.com/setup_6.x | Sudo -E bash -
Que signifie le dernier -
(trait d'union) après bash
?
J'ai vu beaucoup de commandes avec cela, et je ne pouvais pas me trouver une explication logique ni trouver le moyen de reformuler une recherche Google pour la rechercher. Est-ce la sortie de la commande piped?
Bash se comporte de manière quelque peu non standard en ce qui concerne -
.
POSIX dit:
Directive 10:
Le premier argument--
qui n'est pas un argument d'option doit être accepté comme un séparateur indiquant la fin des options. Tous les arguments suivants doivent être traités comme des opérandes, même s'ils commencent par le caractère-
.[…]
Directive 13:
Pour les utilitaires qui utilisent des opérandes pour représenter les fichiers à ouvrir en lecture ou en écriture, l'opérande-
doit être utilisé pour signifier uniquement une entrée standard (ou une sortie standard lorsqu'il est clair du contexte qu'un fichier de sortie est spécifié ) ou un fichier nommé-
.
Et
Lorsqu'un utilitaire décrit dans le volume Shell et utilitaires de POSIX.1-2017 comme conforme à ces consignes est tenu d'accepter ou de ne pas accepter l'opérande
-
pour désigner une entrée ou une sortie standard, cet usage est expliqué dans la section OPÉRANDES. Sinon, si un tel utilitaire utilise des opérandes pour représenter des fichiers, il est défini par l'implémentation si l'opérande-
représente l'entrée standard (ou la sortie standard) ou un fichier nommé-
.
Mais alors man 1 bash
lit:
Un
--
signale la fin des options et désactive le traitement ultérieur des options. Tous les arguments après le--
sont traités comme des noms de fichiers et des arguments. Un argument de-
équivaut à--
.
Donc, pour Bash, -
ne signifie ni une entrée standard ni un fichier, donc un peu non standard.
Maintenant votre cas particulier:
curl -sL https://rpm.nodesource.com/setup_6.x | Sudo -E bash -
I suspect l'auteur de cette commande peut ne pas se rendre compte que -
est équivalent à --
dans ce cas. I suspect l'auteur voulait s'assurer que bash
lirait à partir de son entrée standard, ils s'attendaient à ce que -
fonctionne conformément à la directive 13.
Mais même si cela fonctionnait conformément à la directive, -
serait inutile ici, car bash
détecte que son entrée standard est un tuyau et agit en conséquence (sauf si -c
est fourni, etc.).
Cependant, -
ne fonctionne pas selon les directives, il fonctionne comme --
. Encore --
est inutile ici car il n'y a pas d'arguments après.
A mon avis, le dernier -
ne change rien. La commande fonctionnerait sans elle.
Pour voir comment --
et -
peuvent être utiles en général, étudiez l'exemple ci-dessous.
cat
dans mon Kubuntu obéit aux deux directives et je l’utiliserai pour démontrer l’utilité de -
et --
.
Laissez un fichier nommé foo
exister. Ceci imprimera le fichier:
cat foo
Laissez un fichier nommé --help
exister. Cela n'imprimera pas le fichier:
cat --help
Mais ceci imprimera le fichier nommé --help
:
cat -- --help
Ceci concaténera le fichier nommé --help
avec tout ce qui provient de l’entrée standard:
cat -- --help -
Il semble que vous n’ayez pas vraiment besoin de --
, car vous pouvez toujours passer ./--help
qui sera interprété comme un fichier. Mais considérez
cat "$file"
quand vous ne savez pas à l’avance quel est le contenu de la variable. Vous ne pouvez pas y ajouter simplement ./
, car il peut s'agir d'un chemin absolu et ./
le casserait. D'autre part, il peut être un fichier nommé --help
(car pourquoi pas?). Dans ce cas, --
est très utile. C'est une commande beaucoup plus robuste:
cat -- "$file"
Dans man bash
, à la fin des options à un caractère, il y a: -
-- A -- signals the end of options and disables further option processing.
Any arguments after the -- are treated as filenames and arguments. An
argument of - is equivalent to --.
Si vous avez cité la commande complète, je ne vois aucune raison d'utiliser -
après bash
dans ce cas, mais cela ne nuit pas.