it-swarm.com.de

Was bedeutet der letzte "-" (Bindestrich) in 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 umformulieren kann. Ist es die Ausgabe des Pipe-Befehls?

15
Omar BISTAMI

Bash verhält sich in Bezug auf - etwas ungewöhnlich.

POSIX sagt:

Leitlinie 10:
Das erste ---Argument, das kein Optionsargument ist, sollte als Trennzeichen für das Ende der Optionen akzeptiert werden. 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, die zum Lesen oder Schreiben geöffnet werden sollen, sollte der Operand - nur die Standardeingabe (oder die Standardausgabe bedeuten, wenn aus dem Kontext hervorgeht, dass eine Ausgabedatei angegeben wird) ) oder eine Datei mit dem Namen -.

Und

Wenn ein Dienstprogramm, das im Shell and Utilities-Band von POSIX.1-2017 als konform mit diesen Richtlinien beschrieben ist, den Operanden - als Standardeingabe oder -ausgabe akzeptieren oder nicht akzeptieren muss, wird diese Verwendung im Abschnitt OPERANDS erläutert. Wenn in einem solchen Dienstprogramm Operanden zur Darstellung von Dateien verwendet werden, wird durch die Implementierung festgelegt, ob der Operand - für Standardeingabe (oder Standardausgabe) oder für eine Datei mit dem Namen - steht.

Aber dann lautet man 1 bash :

Ein -- signalisiert das Ende von Optionen und deaktiviert die weitere Optionsverarbeitung. Alle Argumente nach dem -- werden als Dateinamen und Argumente behandelt. Ein Argument von - entspricht --.

Für Bash bedeutet - weder Standardeingabe noch eine Datei, daher etwas ungewöhnlich.

Nun zu Ihrem speziellen Fall:

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

I suspect Der Autor dieses Befehls erkennt möglicherweise nicht, dass - in diesem Fall -- entspricht. I suspect Der Autor wollte sicherstellen, dass bash von seiner Standardeingabe liest. Er erwartete, dass - gemäß der Richtlinie 13 funktioniert.

Aber selbst wenn es gemäß der Richtlinie funktioniert, wäre - hier unnötig, da bash erkennt, wann seine Standardeingabe eine Pipe ist und entsprechend handelt (es sei denn, -c ist angegeben usw.).

Dennoch funktioniert - nicht gemäß der Richtlinie, sondern wie --. Trotzdem ist -- hier nicht notwendig, da es keine Argumente danach gibt.

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

Sehen Sie sich das folgende Beispiel an, um zu sehen, wie nützlich -- und - im Allgemeinen sein können.


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

Lassen Sie eine Datei mit dem Namen foo existieren. Dadurch wird die Datei gedruckt:

cat foo

Lassen Sie eine Datei mit dem Namen --help existieren. Die Datei wird nicht gedruckt:

cat --help

Aber dies wird die Datei mit dem Namen --help drucken:

cat -- --help

Dadurch wird die Datei mit dem Namen --help mit der Standardeingabe verknüpft:

cat -- --help -

Anscheinend brauchen Sie -- nicht wirklich, da Sie ./--help immer übergeben können, was mit Sicherheit 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 es sich möglicherweise um einen absoluten Pfad handelt und ./ ihn beschädigen würde. Andererseits kann eine Datei mit dem Namen --help sein (warum nicht?). In diesem Fall ist -- sehr nützlich. Dies ist ein viel robusterer Befehl:

cat -- "$file"
31

In man bash steht 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 in Anführungszeichen gesetzt haben, sehe ich in diesem Fall keinen Grund, - nach bash zu verwenden, aber es schadet nicht.

6
AFH