Bash verhält sich etwas ungewöhnlich, wenn es um -
geht .
POSIX sagt:
Richtlinie 10:
Die erste --
Argument, das kein Optionsargument ist, sollte als Trennzeichen akzeptiert werden, das das Ende von Optionen angibt. Alle folgenden Argumente sollten als Operanden behandelt werden, auch wenn sie mit -
beginnen Zeichen.
[…]
Richtlinie 13:
Für Dienstprogramme, die Operanden verwenden, um Dateien darzustellen, die zum Lesen oder Schreiben geöffnet werden sollen, wird der -
Operand sollte verwendet werden, um nur die Standardeingabe (oder die Standardausgabe, wenn aus dem Kontext klar ist, dass eine Ausgabedatei angegeben wird) oder eine Datei mit dem Namen -
zu bezeichnen .
Und
Wenn ein Dienstprogramm, das im Band Shell and Utilities von POSIX.1-2017 als konform mit diesen Richtlinien beschrieben wird, den Operanden -
akzeptieren oder nicht akzeptieren muss bedeutet Standardeingabe oder -ausgabe, diese Verwendung wird im Abschnitt OPERANDEN erklärt. Andernfalls, wenn ein solches Dienstprogramm Operanden verwendet, um Dateien darzustellen, ist es implementierungsdefiniert, ob der Operand -
steht für Standardeingabe (oder Standardausgabe) oder für eine Datei namens -
.
Aber dann man 1 bash
lautet:
Ein --
signalisiert das Ende der Optionen und sperrt die weitere Optionsverarbeitung. Alle Argumente nach --
werden als Dateinamen und Argumente behandelt. Ein Argument von -
entspricht --
.
Also für Bash -
bedeutet weder Standardeingabe noch eine Datei, daher etwas nicht standardisiert.
Nun zu Ihrem speziellen Fall:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Ich vermute Der Autor dieses Befehls erkennt möglicherweise -
nicht entspricht --
in diesem Fall. Ich vermute der Autor wollte sicherstellen, dass bash
wird von seiner Standardeingabe gelesen, sie erwarteten -
gemäß Richtlinie 13 zu arbeiten.
Aber auch wenn es nach der Richtlinie -
funktioniert hat wäre hier unnötig, weil bash
erkennt, wenn seine Standardeingabe eine Pipe ist, und verhält sich entsprechend (es sei denn, -c
gegeben ist usw.).
Doch -
funktioniert nicht nach Richtlinie, sondern wie --
. Immer noch --
ist hier unnötig, weil es keine Argumente danach gibt.
Meiner Meinung nach die letzte -
ändert nichts. Der Befehl würde auch ohne funktionieren.
Um zu sehen, wie --
und -
allgemein nützlich sein können, sehen Sie sich das Beispiel unten an.
cat
in meinem Kubuntu befolgt beide Richtlinien und ich werde es verwenden, um die Nützlichkeit von -
zu demonstrieren und --
.
Lassen Sie eine Datei namens foo
existieren. Dies druckt die Datei:
cat foo
Lassen Sie eine Datei namens --help
existieren. Dadurch wird die Datei nicht gedruckt:
cat --help
Aber dies wird die Datei namens --help
drucken :
cat -- --help
Dadurch wird die Datei mit dem Namen --help
verkettet mit was auch immer aus der Standardeingabe kommt:
cat -- --help -
Es scheint, dass Sie --
nicht wirklich brauchen , da Sie immer ./--help
übergeben können die sicher als Datei interpretiert wird. Aber bedenke
cat "$file"
wenn Sie vorher nicht wissen, was der Inhalt der Variablen ist. Sie können ./
nicht einfach voranstellen da es ein absoluter Pfad sein kann und ./
würde es kaputt machen. Andererseits kann es sein eine Datei namens --help
sein (weil warum nicht?). In diesem Fall --
ist sehr nützlich; Dies ist ein viel robusterer Befehl:
cat -- "$file"
In man bash
, am Ende der Einzelzeichenoptionen steht:-
-- 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, -
zu verwenden nach bash
in diesem Fall, aber es schadet nicht.