Was bedeutet der Bindestrich "-" in "tar xzf -"?

23

Beim Versuch, dropbox von der Kommandozeile aus zu installieren, habe ich die Kommandos gelesen

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

was -heißt hier ist es das vorherige Verzeichnis?

Algebra
quelle
9
Ein bisschen Pedanterie: Die Option, nach der Sie fragen, ist f -. Dies könnte das Auffinden der Antwort in den Manpages etwas erleichtern.
Studog
4
Es wäre sehr hilfreich, wenn Sie erklären könnten, was genau Ihnen über die Dokumentation von wgetund unklar ist tar. Auf diese Weise können die jeweiligen Entwickler ihre Dokumentation verbessern, sodass zukünftige Benutzer nicht erneut über dieselben Probleme stolpern. Mit anderen Worten: Sei ein Held und mache die Welt zu einem besseren Ort!
Jörg W Mittag
2
Es wäre eine gute Vorgabe für tar, stdin zu verwenden, aber da es das Erbe ist, mit Bändern zu arbeiten, hat es das nicht getan. Stattdessen lernte es, wie man mit Dateien arbeitet (mit der Option f) und befolgte dann die Konvention, dass ein - anstelle des Dateinamens für stdin (bei eXtract oder stdout bei Create)
am
1
@eckes Im Fall von GNU tar, stdin ist der Standard , wenn nicht $TAPEgesetzt ist.
chrylis -on strike-

Antworten:

42

Einige Befehle akzeptieren -anstelle eines Dateinamens:

  • Zum Schreiben in die Standardausgabe anstatt in eine benannte Datei. Dies ist, was das -Argument, an das wgetdanach übergeben wurde, -Otut.
  • Von der Standardeingabe statt von einer benannten Datei lesen . Dies ist , was das -Argument übergeben tarnach xzf.

Mit dem wgetangezeigten Befehl wird eine Archivdatei heruntergeladen und mit entpackt tar. Um dies zu erreichen, wird der Ausgang des wgetIS geleitet ( |) mit dem Eingang tar. Aus diesem Grund wgetwird anstelle einer Datei in die Standardausgabe geschrieben und anstelle einer Datei taraus der Standardeingabe gelesen.

Eliah Kagan
quelle
Ich würde eher "die meisten Befehle" als nur "einige Befehle" sagen. Ich glaube, es ist Teil der POSIX-Optionssyntaxspezifikation.
Barmar
2
@Barmar Ja und Nein: Richtlinie 13: Für Dienstprogramme, die Operanden verwenden, um Dateien darzustellen, die zum Lesen oder Schreiben geöffnet werden sollen, sollte der Operand '-' nur als Standardeingabe (oder als Standardausgabe, wenn sich aus dem Kontext ergibt, dass dies nicht zutrifft) verwendet werden eine Ausgabedatei wird angegeben) oder eine Datei mit dem Namen -. . Also , wenn - ein Operand für eine „Datei - Option“ und es hat eine besondere Bedeutung, dann muss er die von stdin / stdout sein. Das Programm ist frei, nicht als Sonderfall zu behandeln und suchen Sie einfach nach Datei-
Bakuriu
(und in diesen Fällen ist das Weglassen der Option in der Regel dasselbe wie das Verwenden -)
Bakuriu
@ Bakuriu Ich verstehe nicht, wie das widerlegt, was ich gesagt habe. Ich vermute, dass die meisten Befehle Dateinamenargumente verwenden, daher sollten sie dieser Richtlinie folgen. Aber vielleicht hätte ich es als "die meisten Befehle, die mit Dateien arbeiten" qualifizieren sollen.
Barmar
1
@Barmar Eine Möglichkeit , die Richtlinie zu folgen ist , sinken zu behandeln -speziell überhaupt, als ein wörtlichen Dateinamen zu behandeln. Die einzige Möglichkeit, gegen die Richtlinie zu verstoßen, besteht darin, sie -speziell zu behandeln, jedoch mit einer anderen Bedeutung als der, die die Richtlinie vorschlägt.
Eliah Kagan
12

Das ist nur ein Dateiname, den viele Unix-Programme als "anstatt eine Datei zu öffnen, lesen stdin(oder schreiben stdout)" interpretieren .

Das bedeutet, dass von der Eingabe gelesen wird, die in das Programm gestreamt wird. in deinem Fall ist das die Ausgabe von wget.

Marcus Müller
quelle
6
Ist es wirklich ein Dateiname ?
Eric Duminil
7
@EricDuminil Es ist ein Dateiname in dem Sinne, dass Programme ihn an einigen Stellen akzeptieren, an denen sie sonst nur Dateinamen akzeptieren würden, aber Sie haben Recht, dass es sich nicht wirklich um einen tatsächlichen Namen einer Datei in einem bestimmten Verzeichnis handelt.
JoL
5
@EricDuminil: Insbesondere für Programme, die dieser Konvention folgen, müssen Sie verwenden, ./-wenn Sie tatsächlich eine Datei mit dem Namen öffnen möchten -.
Jörg W Mittag
4
@EricDuminil In der Tat: ja! Es benennt eine Datei ; Im Unix-Sinne stdinist dies ein Dateideskriptor und -der Name, den Sie angeben, um diesen zu verwenden. Aus Sicht des Betriebssystems handelt es sich jedoch nicht um einen Dateinamen. Nur aus Benutzersicht.
Marcus Müller
3
@rexkogitans Nr. /dev/stdinist nur ein Dateiname, den ein Kernel anbietet. Es ist in der Regel nicht fopen("/dev/stdin", "r") überall passiert , wenn Sie ein Programm schreiben , dass wählt stdin zu verwenden; Sie gehen einfach weiter und verwenden das extern FILE* stdin, was Sie von Ihrem libc-Header erhalten haben. das ist übrigens der Integer-Dateideskriptor 0.
Marcus Müller
5

Das -Argument für targibt an, dass das Archiv stdinanstelle einer Datei gelesen werden soll . Aus dem GNU-Teer-Handbuch :

Wenn Sie -als Archivname verwenden , wird tardas Archiv von der Standardeingabe gelesen (beim Auflisten oder Extrahieren von Dateien).

Andere Befehle haben das gleiche Verhalten und sind im POSIX.1-2017-Standard festgelegt :

Leitlinie 13 :

Für Dienstprogramme, die Operanden verwenden, um Dateien darzustellen, die zum Lesen oder Schreiben geöffnet werden -sollen, sollte der Operand " " nur als Standardeingabe (oder Standardausgabe verwendet werden, wenn aus dem Kontext klar hervorgeht, dass eine Ausgabedatei angegeben wird) oder als Datei benannt -.

Tim
quelle