it-swarm.com.de

Was bedeutet Bindestrich "-" am Ende eines Befehls?

Gegeben den folgenden Befehl:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf –

Was macht das - am Ende des Befehls bedeuten? Ist es eine Art Platzhalter?

82
Eugene S

In diesem Fall bedeutet dies „Standardeingabe“. Es wird von einer Software (z. B. tar) verwendet, wenn ein Dateiargument erforderlich ist und Sie stattdessen stdin verwenden müssen. Es ist kein Shell-Konstrukt und hängt vom verwendeten Programm ab. Überprüfen Sie die Manpage im Zweifelsfall!

In diesem Fall ist die Standardeingabe das Argument für die Option -f. In Fällen, in denen - Nicht unterstützt wird, können Sie etwas wie tar xvf /proc/self/fd/0 Oder tar xvf /dev/stdin Verwenden (letzteres wird in verschiedenen Unices weitgehend unterstützt).

Verlassen Sie sich nicht darauf, dass dies allgemein "Standardeingabe" bedeutet. Da es nicht von der Shell interpretiert wird, kann jedes Programm nach Belieben damit umgehen. In einigen Fällen ist es Standard Ausgabe oder etwas ganz anderes: Auf su bedeutet es "Login-Shell starten". In anderen Fällen wird es überhaupt nicht interpretiert. Das Muskelgedächtnis hat mich dazu gebracht, einige Dateien mit dem Namen - Zu erstellen, weil eine Version eines Programms, mit dem ich den Bindestrich verwendet habe, nicht verstanden wurde.

86
Alexios

In diesem Fall ist - Eigentlich ziemlich nutzlos, vorausgesetzt, Sie verwenden Linux:

GNU tar (die Version unter Linux) akzeptiert seine Eingabe standardmäßig von der Standardeingabe. Wenn Sie nicht dieses Verhalten möchten und den Dateinamen als Befehlszeilenargument übergeben möchten, müssen Sie das Flag f angeben:

tar xf filename

Das ist also dasselbe wie

tar x < filename

Oder wenn die Eingabe wie in Ihrem Beispiel komprimiert ist:

gzip -dc filename | tar x

Es ist nicht sinnvoll, das Flag f hier überhaupt anzugeben, aber da es angegeben wurde, muss der Dateiname als - Angegeben werden, um anzugeben, dass aus der Standardeingabe gelesen werden soll (siehe andere Antwort). Um es zu wiederholen, dies ist überflüssig und etwas seltsam.

Darüber hinaus kann die obige Zeile vereinfacht werden, da GNU tar angewiesen werden kann, die Eingabe durch gzip selbst zu streamen, indem das Flag z angegeben wird:

tar xfz filename

- Sie müssen gzip nicht explizit aufrufen.

14
Konrad Rudolph