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.
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ę:
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. :)
-
nie musi znajdować się na końcu polecenia. Na przykład:ls -l | diff - /old_ls_output.txt
.Odpowiedzi:
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
-f
opcji. W przypadkach, gdy-
nie jest obsługiwany, możesz uciec od używania czegoś takiego jaktar xvf /proc/self/fd/0
lubtar 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
su
nim 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.źródło
STDOUT
, w zależności od kontekstu./dev/stdin
lub/dev/stdout
moż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.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ąbash
możesz użyć łącznika, w którym większość miejsc oczekuje nazwy pliku. To oczywiste uzupełnienie <| > IMHOcat
uchwyty-
(sprawdź stronę). Wersja wbudowana w powłokęcat
moż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/stdin
lub/proc/self/fd/0
). Iecho 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,cat
idiff
oba te elementy wyraźnie rozumieją myślniki.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
:To jest to samo co
Lub, jeśli dane wejściowe są spakowane gzip jak w twoim przykładzie:
Określenie
f
flagi 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
gzip
samąz
flagę:- Nie trzeba dzwonić
gzip
jawnie.źródło
tar
maz
opcję.tar
domyślnie korzysta z pierwszego napędu taśmowego ze względów historycznych./dev/sa0
w FreeBSD 9.0,/dev/rst0
NetBSD 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/etc
którym domyślnie jest to napęd taśmowy. GNU tar, Schilling tar, OSX i BusyBox domyślnie ustawione na stdin / stdout.tar
domyślnie drugi napęd taśmowy. :)