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