Co oznacza 2> / dev / null?

242

Chciałbym krótko objaśnić następującą linię poleceń:

grep -i 'abc' content 2>/dev/null 
Naiwny
źródło

Odpowiedzi:

347

Operator> przekierowuje dane wyjściowe zwykle do pliku, ale może to być urządzenie. Możesz także użyć >>, aby dołączyć.

Jeśli nie podasz liczby, przyjmowany jest standardowy strumień wyjściowy, ale możesz także przekierowywać błędy

> fileprzekierowuje stdout do pliku
1> fileprzekierowuje stdout do pliku
2> fileprzekierowuje stderr do pliku
&> fileprzekierowuje stdout i stderr do pliku

/dev/nulljest zerowym urządzeniem, które pobiera dowolne dane wejściowe i wyrzuca je. Można go użyć do stłumienia dowolnego wyjścia.

Warren Hill
źródło
6
czy jest różnica między > /dev/null 2>&1i&> /dev/null
Alexander Mills,
13
W dzisiejszych czasach nie sądzę, aby istniała 2>&1starsza składnia, więc &>nie działałaby wiele lat temu, ale obie są równoważne.
Warren Hill,
28

Krótko mówiąc, przekierowuje stderr(fd 2) do czarnej dziury (odrzuca wyjście polecenia).

Niektóre bardziej powszechne przypadki użycia przekierowania:

command > /dev/null 2>&1 &

Uruchom commandw tle, odrzuć stdoutistderr

command >> /path/to/log 2>&1 &

Uruchom commandi dołącz stdout i stderr do pliku dziennika.

W Bash 4+ funkcjonuje krótsza (ale mniej czytelna) forma

command &>> /path/to/log
Terry Wang
źródło
3
Czy istnieje dobry powód, aby użyć > /dev/null 2>&1zamiast &> /dev/null?
Craig McQueen,
7
@CraigMcQueen &>jest nowy w Bash 4, ten pierwszy to tradycyjny sposób, jestem tak przyzwyczajony (łatwy do zapamiętania).
Terry Wang
@CraigMcQueen zgodnie z komentarzem do tej odpowiedzi , &> /dev/nullmoże nie działać w niektórych powłokach, ale> / dev / null 2> i 1 będzie działać we wszystkich powłokach zgodnych z POSIX.
Stack Underflow
3
Dlaczego to jest 2> i 1, a nie 2 i 1> ??
marienbad
1
@marienbad to właściwie pytanie, które warto opublikować :-) Składnia brzmi fn>target: gdzie fnjest numer pliku (zazwyczaj 0-2, niektóre programy definiują więcej liczb) i targetzwykle jest to nazwa pliku, ale tutaj jest inny numer pliku - z prefiksem, &którym jest składnia dla „Chcę numer pliku zamiast nazwy pliku”.
toolforger
9

/dev/nullw Linuksie / Uniksie jest traktowany jako czarna dziura, więc możesz w to wszystko włożyć, ale nie będziesz w stanie go odzyskać /dev/null.

Ponadto 2>oznacza, że ​​przekierowujesz (tj. >) Stderr (tj. 2) Do czarnej dziury (tj. /dev/null)

Twoje polecenie to:

grep -i 'abc' content 2>/dev/null 

Nie próbuj kończyć kolejnym ukośnikiem takim jak ten - 2>/dev/null/(to nie jest katalog).

Indrajeet Gour
źródło
2

Treść grep -i 'abc' wygeneruje dane wyjściowe wyświetlane na konsoli, w tym wszelkie błędy.

Określenie 2>/dev/nullspowoduje odfiltrowanie błędów, aby nie były one wysyłane do konsoli.

Bardziej szczegółowo: 2 oznacza deskryptor błędu, w którym zapisywane są błędy. Domyślnie są one drukowane na konsoli.

\> przekierowuje dane wyjściowe do określonego miejsca, w tym przypadku /dev/null

/dev/null to standardowe urządzenie Linux, do którego wysyłasz dane wyjściowe, które chcesz zignorować.

Mauro Zallocco
źródło
Zwięzły i na temat. Dobra odpowiedź.
Sergiy Kolodyazhnyy