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 &
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 &
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.
0
(stdin), 1
(stdout) i 2
(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
i curl 2>/dev/null
po prostu zobaczyć zmianę sygnału wyjściowego. Znów ampersand jest potrzebny tylko do przekierowania deskryptora pliku.
Pobierz http://www.google.com
w tle i odrzuć zarówno stdout
i stderr
.
curl http://www.google.com > /dev/null 2>&1 &
jest taki sam jak
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
I 2
stanowią standardowe plików deskryptorów w POSIX systemów operacyjnych. Deskryptor pliku to systemowe odwołanie do (w zasadzie) pliku lub gniazda .
Utworzenie nowego deskryptora pliku w C może wyglądać mniej więcej tak:
fd = open("data.dat", O_RDONLY)
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 do stdout
.
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ście myfiles.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.
Pierwsza część > /dev/null
przekierowuje stdout
, to jest curl
wyjście do /dev/null
(więcej o tym naprzód) i 2>&1
przekierowuje stderr
do stdout
(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)
albo stderr (2)
z plików nazwanych 1
lub 2
. Tak, 2>1
by skończyć tworzenia nowego pliku (jeśli nie istnieje już) o nazwie 1
i zrzucić stderr
wynik tam.
/dev/null
jest pustym plikiem, mechanizmem używanym do odrzucania wszystkiego, co do niego zapisano. Tak więc
curl http://www.google.com > /dev/null
skutecznie tłumi curl
wydajność.
Ale dlaczego na terminalu są jeszcze jakieś rzeczy ?. To nie curl
jest zwykłe wyjście, ale dane wysyłane do stderr
, 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ówno curl
dane wyjściowe, jak i curl
informacje o postępie. W rezultacie nic nie jest wyświetlane na terminalu.
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, wpisz jobs
w swoim terminalu. Uwaga: różni się to od procesów uruchomionych w systemie. Aby zobaczyć te, wpisz top
w terminalu.
/dev/null
? Nie chcesz, żeby wyniki curl
przynajmniej gdzieś były przydatne?
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 do logfile
.
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