web-dev-qa-db-fra.com

Que signifie le dernier "-" (trait d'union) dans les options de `bash`?

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?

15
Omar BISTAMI

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"
31
Kamil Maciorowski

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.

6
AFH