Was ist die Magie von "-" (ein Bindestrich) in Befehlszeilenparametern?

100

Beispiele:

  • Erstellen Sie ein ISO-Image und brennen Sie es direkt auf eine CD.

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • Wechseln Sie in das vorherige Verzeichnis.

    cd -

  • Lauschen Sie Port 12345 und entpacken Sie die an ihn gesendeten Daten.

    nc -l -p 12345 | tar xvzf -

Was ist der Zweck des Bindestrichs und wie verwende ich ihn?

chemila
quelle

Antworten:

111

Wenn Sie -am Ende des tarBefehls " nackt" meinen , ist dies bei vielen Befehlen üblich, die eine Datei verwenden möchten.

Hier können Sie anstelle eines tatsächlichen Dateinamens eine Standardeingabe oder -ausgabe angeben .

Dies ist bei Ihrem ersten und dritten Beispiel der Fall. Der cdrecordBefehl nimmt beispielsweise die Standardeingabe (den von erzeugten ISO-Bildstrom mkisofs) und schreibt sie direkt in /dev/dvdrw.

Mit dem cdBefehl wird jedes Mal, wenn Sie das Verzeichnis wechseln, das Verzeichnis gespeichert, aus dem Sie gekommen sind. Wenn Sie cdmit dem speziellen -"Verzeichnisnamen" arbeiten, wird dieses gespeicherte Verzeichnis anstelle eines echten Verzeichnisses verwendet. Auf diese Weise können Sie ganz einfach schnell zwischen zwei Verzeichnissen wechseln.

Andere Befehle können -als anderer Sonderwert behandelt werden.

paxdiablo
quelle
9
Beachten Sie, dass Sie auch -für Git-Zweige verwenden können, dh Sie können mitgit checkout -
snappieT
3
Wo in den TAR-Dokumenten wird erklärt, dass es unterstützt wird? Woher weiß ich, welche Befehle dies unterstützen?
1
Wenn ein Befehl eine besondere Bedeutung für hat -, finden Sie seine Erklärung in der Manpage.
Codeforester
su - #make die Shell eine Login-Shell
atongsa
Ich finde einen Befehl wie diesen sehr merkwürdig: tar -cvf - / home | aescrypt -e -p Äpfel -> backup_files.tar.aes, was tatsächlich tar -cvf - / home | ist aescrypt -e -p Äpfel -o backup_files.tar.aes - weil das Rohrleitungszeichen | sollte das Vorhandensein des letzten Strichs unnötig machen. Aber ohne den letzten Strich schlägt der Befehl fehl. Klingt unlogisch. Kann mir bitte jemand eine Referenz geben, in der die Bedeutung des nackten Strichs in Befehlszeilen erklärt wird. Ich kann keine finden.
Elmclose
22

Es ist keine Magie. Einige Befehle werden so interpretiert -, dass der Benutzer von stdin lesen oder in stdout schreiben möchte. An der Schale ist nichts Besonderes.

Ignacio Vazquez-Abrams
quelle
9
Außer im Fall von cd -; bash(1)behandelt, cd -als ob Sie geschrieben hätten cd $OLDPWD.
Sarnold
6
@sarnold Aber der Punkt ist der gleiche cd- ein in die Shell integrierter Befehl - interpretiert einen Bindestrich selbst. Keine "Magie" :-)
2
@pst, sicher, keine Magie (es ist alles nur Code :), aber es ist etwas Besonderes , um es in die Schale.
Sarnold
13

Umleitung von oder nach stdinoder stdout.

Siehe: http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2

Ry-
quelle
Wie immer muss das ABS mit einem Salzkorn eingenommen werden. Zum Beispiel bedeutet dies , dass die Umleitung gibt es hier, aber dies unterscheidet sich von der Umleitung Betreiber Shell ( <, >, |, usw.).
Tripleee
9

-bedeutet genau das, was jeder Befehl bedeuten soll. Es gibt mehrere gängige Konventionen, und Sie haben Beispiele für die meisten davon in anderen Antworten gesehen, aber keine davon ist 100% universell.

Es gibt nichts Magisches an dem -Charakter, was die Shell betrifft (außer dass die Shell selbst und einige ihrer eingebauten Befehle wie cdund echoauf herkömmliche Weise verwendet werden). Einige Zeichen, wie \, 'und ", sind "magisch" und haben überall dort, wo sie erscheinen, eine besondere Bedeutung. Dies sind "Shell-Metazeichen". -ist nicht so.

Lesen Sie die Dokumentation zu diesem Befehl- , um zu sehen, wie ein bestimmter Befehl verwendet wird .

Keith Thompson
quelle
7

Die Magie liegt in der Konvention. Seit Jahrtausenden verwenden Menschen '-', um Optionen von Argumenten zu unterscheiden, und haben '-' in einem Dateinamen verwendet, um je nach Bedarf entweder stdin oder stdout zu bedeuten. Unterschätzen Sie nicht die Kraft der Konvention!

William Pursell
quelle
Überschätzen Sie nicht die Fähigkeit der Menschen, Sprachweisen von wörtlichen Ausdrücken zu unterscheiden. Dies ist seit Jahrtausenden nicht mehr so.
Tripleee
1
@tripleee - Stimmt, aber es hat Milliarden von Sekunden gedauert. ;-)
David R Tribble
5

Es bedeutet, den Standardeingabestream des Programms zu verwenden.

Im Fall von cdbedeutet dies etwas anderes: Wechseln Sie in das vorherige Arbeitsverzeichnis.

Brian Cain
quelle