Bash se comporte de manière quelque peu non standard en ce qui concerne -
.
POSIX dit:
Ligne directrice 10:
Le premier --
argument qui n'est pas un argument d'option doit être accepté comme délimiteur 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 d'après le 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 directives doit accepter ou ne pas accepter l'opérande -
pour signifier une entrée ou une sortie standard, cette utilisation est expliquée dans la section OPERANDES. 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 man 1 bash
lit ensuite :
A --
signale la fin des options et désactive le traitement des options. Tous les arguments après le --
sont traités comme des noms de fichiers et des arguments. Un argument de -
est équivalent à --
.
Donc pour Bash -
ne signifie ni entrée standard ni fichier, donc quelque peu non standard.
Maintenant, votre cas particulier:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Je soupçonne que l'auteur de cette commande peut ne pas réaliser que -
c'est équivalent --
dans ce cas. Je soupçonne que l'auteur voulait s'assurer de bash
lire à partir de son entrée standard, ils s'attendaient-
à travailler selon la directive 13.
Mais même si cela fonctionnait selon la directive, ce -
serait inutile ici car il bash
détecte quand son entrée standard est un tuyau et agit en conséquence (sauf-c
etc.).
Pourtant, -
ne fonctionne pas selon la directive, cela fonctionne comme --
. C'est encore --
inutile ici car il n'y a pas d'arguments après.
À 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 vais l'utiliser pour démontrer l'utilité de -
et --
.
Laissez un fichier nommé foo
exister. Cela imprimera le fichier:
cat foo
Laissez un fichier nommé --help
exister. Cela n'imprimera pas le fichier:
cat --help
Mais cela imprimera le fichier nommé --help
:
cat -- --help
Cela concaténera le fichier nommé --help
avec tout ce qui provient de l'entrée standard:
cat -- --help -
Il semble que vous n'en ayez pas vraiment besoin --
, car vous pouvez toujours passer ./--help
ce qui sera interprété comme un fichier à coup sûr. Mais considérez
cat "$file"
lorsque vous ne savez pas à l'avance quel est le contenu de la variable. Vous ne pouvez pas simplement y ajouter un préfixe ./
, car il peut s'agir d'un chemin absolu ./
qui le briserait. Par contre il peut s'agir d'un fichier nommé --help
(car pourquoi pas?). Dans ce cas, --
est très utile; c'est une commande beaucoup plus robuste:
cat -- "$file"