Wiem, że >
znak służy do przekierowania wyjścia w wierszu polecenia, ale mam problem ze znalezieniem czegoś, co wyjaśnia użycie 2>&1
w wierszu polecenia. Na przykład:
curl http://www.google.com > /dev/null 2>&1 &
command-line
shell
redirection
Matt Huggins
źródło
źródło
Odpowiedzi:
1
Standardowe wyjście oznacza (wyjścia).2
Oznacza błąd standardowy (stderr).2>&1
Mówi więc o wysyłaniu standardowego błędu tam, gdzie przekierowuje się standardowe wyjście. Co, ponieważ jest wysyłane,/dev/null
przypomina ignorowanie jakichkolwiek danych wyjściowych.źródło
0
(stdin),1
(stdout) i2
(stderr) są w rzeczywistości deskryptorami plików, powłoka wymaga znaku ampersand umieszczonego przed nimi w celu przekierowania. W tym przypadku powiela deskryptor pliku, skutecznie łącząc ze sobą dwa strumienie informacji.curl http://www.google.com 2>/dev/null
Skąd wiersz poleceń wie, że „2” ma oznaczać stderr i nie jest tak naprawdę drugim parametrem, który przekazuję do polecenia curl?stderr
prostej do/dev/null
zamiast. Widać to w praktyce poprzez próbęcurl
,curl 1>/dev/null
icurl 2>/dev/null
po prostu zobaczyć zmianę sygnału wyjściowego. Znów ampersand jest potrzebny tylko do przekierowania deskryptora pliku.tl; dr
Pobierz
http://www.google.com
w tle i odrzuć zarównostdout
istderr
.jest taki sam jak
Podstawy
0
,1
I2
stanowią standardowe plików deskryptorów w POSIX systemów operacyjnych. Deskryptor pliku to systemowe odwołanie do (w zasadzie) pliku lub gniazda .0 stdin
1 stdout
2 stderr
Utworzenie nowego deskryptora pliku w C może wyglądać mniej więcej tak:
Większość poleceń systemu Unix pobiera dane wejściowe i wyprowadza wynik do terminala.
curl
pobierze wszystko, co jest pod określonym adresem URL ( google dot com ) i wyświetli wynik dostdout
.Przekierowanie
Tak jak powiedziałeś
<
i>
służą do przekierowania wyjścia z polecenia do innego miejsca, na przykład pliku.Na przykład, w
ls > myfiles.txt
,ls
pobiera zawartość bieżącego katalogu i>
przekierowuje jego wyjściemyfiles.txt
(jeśli plik nie istnieje, to zostanie utworzony, w przeciwnym razie nadpisane, ale można użyć>>
zamiast>
dołączyć do pliku zamiast). Jeśli uruchomisz powyższe polecenie, zauważysz, że terminal nie wyświetla niczego. Zazwyczaj oznacza to sukces w systemach uniksowych. Aby to sprawdzić,cat myfiles.txt
wyświetl zawartość pliku na ekranie.> / dev / null 2> i 1
Pierwsza część
> /dev/null
przekierowujestdout
, to jestcurl
wyjście do/dev/null
(więcej o tym naprzód) i2>&1
przekierowujestderr
dostdout
(który właśnie został przekierowany,/dev/null
więc wszystko zostanie wysłane/dev/null
).Lewa strona
2>&1
informuje o tym , co zostanie przekierowane, a prawa strona informuje, dokąd .&
Stosowany jest po prawej stronie, aby odróżnićstdout (1)
albostderr (2)
z plików nazwanych1
lub2
. Tak,2>1
by skończyć tworzenia nowego pliku (jeśli nie istnieje już) o nazwie1
i zrzucićstderr
wynik tam./ dev / null
/dev/null
jest pustym plikiem, mechanizmem używanym do odrzucania wszystkiego, co do niego zapisano. Tak więccurl http://www.google.com > /dev/null
skutecznie tłumicurl
wydajność.Ale dlaczego na terminalu są jeszcze jakieś rzeczy ?. To nie
curl
jest zwykłe wyjście, ale dane wysyłane dostderr
, używane tutaj do wyświetlania postępu i informacji diagnostycznych, a nie tylko błędów .curl http://www.google.com > /dev/null 2>&1
ignoruje zarównocurl
dane wyjściowe, jak icurl
informacje o postępie. W rezultacie nic nie jest wyświetlane na terminalu.Wreszcie
Na
&
końcu jest jak powiedzieć powłoce, aby uruchomiła polecenie jako zadanie w tle . Powoduje to natychmiastowe zwrócenie monitu, gdy polecenie jest uruchamiane asynchronicznie za sceną. Aby zobaczyć aktualne zadania, wpiszjobs
w swoim terminalu. Uwaga: różni się to od procesów uruchomionych w systemie. Aby zobaczyć te, wpisztop
w terminalu.Bibliografia
źródło
/dev/null
? Nie chcesz, żeby wynikicurl
przynajmniej gdzieś były przydatne?2
odnosi się do STDERR.2>&1
wyśle STDERR do tej samej lokalizacji co1
(STDOUT).źródło
Rozumiem, co następuje:
Jeśli chcesz tylko odczytać informacje o wyjściu i błędzie polecenia na ekranie, po prostu napisz:
curl http://www.google.com
Czasami chcesz zapisać informacje wyjściowe do pliku zamiast ekranu terminala do późniejszego przejrzenia, a następnie możesz napisać:
curl http://www.google.com > logfile
Ale w ten sposób informacje StdErr zostaną pominięte, ponieważ
>
przekierowują tylko StdOut dologfile
.Jeśli więc zależy Ci na informacjach o błędzie polecenia, które nie wykonało się, musisz połączyć StdOut ze StdErr za pomocą
2>&1
(co oznacza złóż StdErr na StdOut), aby można było napisać następującą linię poleceń:curl http://www.google.com > logfile
2> i 1źródło