Was bedeutet das letzte "-" (Bindestrich) in den Optionen von `bash`?

In diesem Tutorial müssen wir den folgenden Befehl ausführen:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Was bedeutet der letzte - (Bindestrich) nach bash?

Ich habe viele Befehle damit gesehen und konnte mir keine logische Erklärung finden und auch nicht herausfinden, wie ich eine Google-Suche danach neu formulieren kann. Ist es die Ausgabe des Piped-Befehls?

Author: Kamil Maciorowski, 2018-12-28

3 answers

Bash verhält sich etwas unüblich, wenn es um - geht.

POSIX sagt:

Leitlinie 10:
Das erste Argument --, das kein Optionsargument ist, sollte als Trennzeichen akzeptiert werden, das das Ende der Optionen angibt. Alle folgenden Argumente sollten als Operanden behandelt werden, auch wenn sie mit dem Zeichen - beginnen.

[…]

Leitlinie 13:
Für Dienstprogramme, die Operanden verwenden, um Dateien darzustellen der zum Lesen oder Schreiben geöffnete Operand - sollte verwendet werden, um nur Standardeingabe (oder Standardausgabe, wenn aus dem Kontext hervorgeht, dass eine Ausgabedatei angegeben wird) oder eine Datei mit dem Namen -.

Und

Wobei ein Dienstprogramm in der Shell und Dienstprogramme Volumen von POSIX beschrieben.1-2017 da die Übereinstimmung mit diesen Richtlinien erforderlich ist, um den Operanden - als Standardeingabe oder-ausgabe zu akzeptieren oder nicht zu akzeptieren, wird diese Verwendung in der OPERANDEN Abschnitt. Andernfalls, wenn ein solches Dienstprogramm Operanden verwendet, um Dateien darzustellen, ist es implementierungsdefiniert, ob der Operand - für Standardeingabe (oder Standardausgabe) oder für eine Datei mit dem Namen - steht.

Aber dann man 1 bash liest:

A -- signalisiert das Ende der Optionen und deaktiviert die weitere Optionsverarbeitung. Alle Argumente nach -- werden als Dateinamen und Argumente behandelt. Ein Argument von - ist äquivalent zu --.

Bedeutet also für Bash - weder Standardeingabe noch eine Datei, daher etwas nicht standardisiert.

Jetzt Ihr besonderer Fall:

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

I vermutet Der Autor dieses Befehls kann nicht erkennen, dass - in diesem Fall -- entspricht. I vermuten der Autor wollte sicher gehen, dass bash liest aus seine standard-Eingabe, die Sie erwarten - funktioniert gemäß der Richtlinie 13.

Aber selbst wenn es nach die Richtlinie - wäre hier nicht erforderlich, da bash erkennt, wann seine Standardeingabe eine Pipe ist, und entsprechend handelt (es sei denn, -c ist angegeben usw.).

Doch - funktioniert nicht nach der Richtlinie, es funktioniert wie --. Dennoch ist -- hier unnötig, da danach keine Argumente mehr vorhanden sind.

Meiner Meinung nach ändert das letzte - nichts. Der Befehl würde ohne ihn funktionieren.

Um zu sehen, wie -- und - im Allgemeinen nützlich sein können, studieren Sie das Beispiel unten.


cat in meinem Kubuntu gehorcht beiden Richtlinien und ich werde es verwenden, um die Nützlichkeit von - und -- zu demonstrieren.

Lassen Sie eine Datei mit dem Namen foo existieren. Dies wird die Datei drucken:

cat foo

Lassen Sie eine Datei mit dem Namen --help existieren. Dies wird die Datei nicht drucken:

cat --help

Dies druckt jedoch die Datei mit dem Namen --help:

cat -- --help

Dadurch wird die Datei mit dem Namen --help mit dem verkettet, was von der Standardeingabe stammt:

cat -- --help -

Es scheint, dass du es nicht tust ich brauche wirklich --, weil Sie immer ./--help übergeben können, was sicher als Datei interpretiert wird. Aber bedenken Sie

cat "$file"

Wenn Sie vorher nicht wissen, was der Inhalt der Variablen ist. Sie können ./ nicht einfach ./ voranstellen, da dies möglicherweise ein absoluter Pfad ist und ./ ihn brechen würde. Andererseits kann es eine Datei mit dem Namen --help sein (weil warum nicht?). In diesem Fall ist -- sehr nützlich; Dies ist ein viel robusterer Befehl:

cat -- "$file"
 32
Author: Kamil Maciorowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-12-28 23:09:25

In man bash befindet sich am Ende der Einzelzeichenoptionen: -

--    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 --.

Wenn Sie den vollständigen Befehl zitiert haben, sehe ich keinen Grund, - nach bash in diesem Fall zu verwenden, aber es schadet nicht.

 6
Author: AFH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-12-28 22:21:11
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash - bedeutet, dass bash auf stdin wartet. Also wird bash praktisch alles ausführen, was von dem Befehl zurückgegeben wird, der sich links von |

Ein ähnliches, aber einfacheres Beispiel wäre:

echo hello | cat - hier druckt cat 'hello'. Warum? Weil 'hallo' über | an cat gesendet wird und cat auf alles wartet, was an cat gesendet wird

Teilen wir nun den gesamten Befehl in zwei Teile auf:

curl -sL https://rpm.nodesource.com/setup_6.x

Dieser Curl-Befehl gibt etwas zurück, das sein kann von bash verstanden und ausgeführt

Dann haben wir eine Pipe |, die die vom Curl-Befehl zurückgegebene Ausgabe an die rechte Seite der Pipe sendet, dh sudo -E bash -. Schließlich ist bash in sudo -E bash - bereit, alles auszuführen, was an ihn gesendet wird

 1
Author: Haris Muzaffar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-10-20 14:08:28