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>&1w 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>&1w wierszu polecenia. Na przykład:
curl http://www.google.com > /dev/null 2>&1 &
Odpowiedzi:
1Standardowe wyjście oznacza (wyjścia). 2Oznacza błąd standardowy (stderr).
2>&1Mówi więc o wysyłaniu standardowego błędu tam, gdzie przekierowuje się standardowe wyjście. Co, ponieważ jest wysyłane, /dev/nullprzypomina 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/nullSkąd wiersz poleceń wie, że „2” ma oznaczać stderr i nie jest tak naprawdę drugim parametrem, który przekazuję do polecenia curl?
stderrprostej do /dev/nullzamiast. Widać to w praktyce poprzez próbę curl, curl 1>/dev/nulli curl 2>/dev/nullpo prostu zobaczyć zmianę sygnału wyjściowego. Znów ampersand jest potrzebny tylko do przekierowania deskryptora pliku.
Pobierz http://www.google.comw tle i odrzuć zarówno stdouti 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, 1I 2stanowią 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. curlpobierze 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, lspobiera 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.txtwyświetl zawartość pliku na ekranie.
Pierwsza część > /dev/nullprzekierowuje stdout, to jest curlwyjście do /dev/null(więcej o tym naprzód) i 2>&1przekierowuje stderrdo stdout(który właśnie został przekierowany, /dev/nullwięc wszystko zostanie wysłane /dev/null).
Lewa strona 2>&1informuje 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 1lub 2. Tak, 2>1by skończyć tworzenia nowego pliku (jeśli nie istnieje już) o nazwie 1i zrzucić stderrwynik tam.
/dev/nulljest pustym plikiem, mechanizmem używanym do odrzucania wszystkiego, co do niego zapisano. Tak więc
curl http://www.google.com > /dev/nullskutecznie tłumi curlwydajność.

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>&1ignoruje zarówno curldane wyjściowe, jak i curlinformacje 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 jobsw swoim terminalu. Uwaga: różni się to od procesów uruchomionych w systemie. Aby zobaczyć te, wpisz topw terminalu.
/dev/null? Nie chcesz, żeby wyniki curlprzynajmniej 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 > logfile2> i 1