Co oznacza myślnik „-” na końcu polecenia?

78

Biorąc pod uwagę następujące polecenie:

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

Co oznacza -koniec polecenia? Czy to jakiś symbol zastępczy?

Eugene S.
źródło
3
Należy wspomnieć o jednym drobnym szczególe: -nie musi znajdować się na końcu polecenia. Na przykład: ls -l | diff - /old_ls_output.txt.
manatwork

Odpowiedzi:

82

W tym przypadku oznacza to „standardowe wejście”. Jest używany przez niektóre programy (np. tar), Gdy wymagany jest argument pliku i zamiast tego należy użyć stdin. To nie jest konstrukcja powłoki i zależy od używanego programu. W razie wątpliwości sprawdź stronę podręcznika!

W tym przypadku standardowe wejście jest argumentem -fopcji. W przypadkach, gdy -nie jest obsługiwany, możesz uciec od używania czegoś takiego jak tar xvf /proc/self/fd/0lub tar xvf /dev/stdin(ten ostatni jest szeroko obsługiwany w różnych unikatach).

Nie polegaj na tym, że oznacza uniwersalne „standardowe wejście”. Ponieważ nie jest interpretowany przez powłokę, każdy program może sobie z tym poradzić w dowolny sposób. W niektórych przypadkach jest to standardowe wyjście lub coś zupełnie innego: na sunim oznacza „uruchom powłokę logowania”. W innych przypadkach nie jest to wcale interpretowane. Pamięć mięśni spowodowała, że ​​utworzyłem całkiem sporo plików o nazwie, -ponieważ niektóre wersje programów, do których byłem przyzwyczajony, nie rozumiały kreski.

Alexios
źródło
4
Może to również oznaczać STDOUT, w zależności od kontekstu.
bahamat
3
I właściwie wszystko inne, ponieważ interpretacja zależy od poszczególnych programów.
Alexios
5
/dev/stdinlub /dev/stdoutmożna go użyć, jeśli naprawdę chcesz strumienia wejściowego / wyjściowego. Należy pamiętać, że jest to strumień, programy, które chcą wyszukiwać w pliku, mogą nie działać z nim poprawnie, tak jak w przypadku -(np.
Ffmpeg
3
W przypadku bashłącznika jest interpretowany przez powłokę. Zobacz Advanced Bash-Scripting Guide - Rozdział 3. Znaki specjalne , a następnie wyszukaj tekst [myślnik] lub „przekierowanie z / na standardowe lub standardowe”. Za pomocą bashmożesz użyć łącznika, w którym większość miejsc oczekuje nazwy pliku. To oczywiste uzupełnienie <| > IMHO
bsd
4
Nie jestem przekonany, że tak jest. Najpierw catuchwyty -(sprawdź stronę). Wersja wbudowana w powłokę catmoże, ale nie musi, ale nie jest to cała powłoka. Ponadto, jeśli obsłużysz powłokę -, możesz powiedzieć echo -i rozszerzy się ona na coś innego. Zamiast tego po prostu przypomina myślnik (nie /dev/stdinlub /proc/self/fd/0). I echo test > -po prostu tworzy plik o nazwie -, więc najwyraźniej też go tam nie obsługuje. Aha, a strona, którą wymieniłeś, nie mówi, że jest obsługiwana przez powłokę , mówi, że możesz jej używać z, cati diffoba te elementy wyraźnie rozumieją myślniki.
Alexios
13

W tym przypadku -jest to całkiem bezużyteczne, zakładając, że używasz Linuksa:

GNU tar (wersja na Linuksa) domyślnie przyjmuje dane wejściowe ze standardowego wejścia. Jeśli nie chcesz tego zachowania i chcesz przekazać nazwę pliku jako argument wiersza poleceń, musisz określić flagę f:

tar xf filename

To jest to samo co

tar x < filename

Lub, jeśli dane wejściowe są spakowane gzip jak w twoim przykładzie:

gzip -dc filename | tar x

Określenie fflagi tutaj nie ma żadnego znaczenia , ale ponieważ została podana, nazwa pliku musi być podana jako -wskazująca, że ​​chcemy czytać ze standardowego wejścia (zobacz inną odpowiedź). Powtarzając, jest to zbędne i nieco dziwne.

Ponadto powyższą linię można uprościć, ponieważ można nakazać tarowi GNU przesyłanie strumieniowe danych wejściowych przez gzipsamą zflagę:

tar xfz filename

- Nie trzeba dzwonić gzipjawnie.

Konrad Rudolph
źródło
1
Uwaga: nie każdy tarma zopcję.
liori
2
Większość systemów operacyjnych innych niż Linux tardomyślnie korzysta z pierwszego napędu taśmowego ze względów historycznych.
Gilles
1
@Gilles i BSD oraz OS X,… Ale jestem ciekaw: Jakie inne systemy z wyjątkiem kilku starych mainframe nadal używać taką wersję (co innego niż systemy mainframe nawet nie mają napędu taśmowego)?
Konrad Rudolph
1
@KonradRudolph Wszystkie trzy główne dyski BSD domyślnie mają napęd taśmowy ( /dev/sa0w FreeBSD 9.0, /dev/rst0NetBSD 6.0 i OpenBSD 5.1). Domyślnie system AIX 7.1 ma wartość /dev/rmt0. Domyślnie MINIX3 to /dev/sa0. (W każdym przypadku sprawdzałem najnowszą wersję systemu operacyjnego, nie są to „stare komputery mainframe”). Solaris można konfigurować za pomocą pliku, w /etcktórym domyślnie jest to napęd taśmowy. GNU tar, Schilling tar, OSX i BusyBox domyślnie ustawione na stdin / stdout.
Gilles
1
@Gilles - Z oczywistych powodów skompilowałem tardomyślnie drugi napęd taśmowy. :)
David Harkness,