Co dokładnie robi 2>/dev/null?

What Exactly Does 2 Dev Null Do



Niezależnie od tego, czy jesteś nowym użytkownikiem Linuksa, czy doświadczonym programistą basha, jest wysoce prawdopodobne, że napotkałeś tajemnicze polecenie 2>/dev/null. Chociaż to polecenie wygląda na skomplikowane technicznie, jego przeznaczenie jest bardzo proste. Odnosi się do urządzenia zerowego, które służy do tłumienia wyjść różnych poleceń. W tym artykule opiszemy każdą część polecenia 2>/dev/null, wyjaśnimy jego przeznaczenie i zobaczymy przykłady jego użycia.

Urządzenie zerowe – „/dev/null”

Wszystkie systemy oparte na systemie Linux mają funkcję zwaną urządzeniami wirtualnymi. Te urządzenia wirtualne działają jak rzeczywiste pliki w systemie operacyjnym. Działanie takich wirtualnych urządzeń jest podobne do rzeczywistych urządzeń; służą do zapisu i odczytu danych. Główna różnica między nimi polega na tym, że dane dla urządzeń wirtualnych są dostarczane przez system operacyjny.







/dev/null to urządzenie zerowe – specjalny typ urządzenia wirtualnego. Jest obecny w każdym systemie Linux, a celem tego urządzenia jest odrzucenie wszystkiego, co do niego wysłane i odczytanie End of File (EOF). Większość urządzeń wirtualnych służy do odczytu danych; jednak /dev/null jest unikalny, ponieważ służy do ukrywania wszelkich zapisanych w nim danych. Mówiąc prościej, działa jak czarna dziura dla wszelkich danych, które są do niego zapisywane w systemach operacyjnych Linux.



Przyjrzyjmy się teraz pozostałym częściom polecenia 2 > /dev/null



Deskryptor pliku – „2”

Każde wykonanie polecenia w systemie Linux generuje trzy powiązane pliki: standardowe wejście, standardowe wyjście i standardowe pliki błędów. System operacyjny Linux odnosi się do każdego z tych plików za pomocą unikalnej nieujemnej liczby całkowitej.





  • „0” dla wejścia standardowego
  • „1” dla wyjścia standardowego
  • „2” dla błędu standardowego

Terminy techniczne dla standardowych strumieni wejścia, standardowego wyjścia i standardowych strumieni błędów to odpowiednio stdin, stdout i stderr.

Wiemy, że liczba „2” w poleceniu „2>/dev/null” odnosi się do strumienia standardowego błędu (stderr).



Operator przekierowania pliku – ‘>’

Symbol „>” jest znany jako operator przekierowania pliku. Jego celem jest skierowanie tego, co znajduje się po jego lewej stronie, do poleceń po prawej stronie. Mówiąc prościej, każdy ciąg danych po lewej stronie zostanie skierowany na prawą stronę operatora.

Do tej pory zrozumieliśmy cel każdego komponentu polecenia 2>/dev/null. Wysyła strumień błędów do /dev/null, który go odrzuca. Innymi słowy, to polecenie służy do odrzucania i tłumienia komunikatów o błędach. Jeśli jednak jesteś doświadczonym weteranem Linuksa, możesz przejrzeć zawartość pliku /dev/null, uruchamiając w terminalu następujące polecenie:

$ls -ten /dev/zero

To polecenie jest zwykle używane w scenariuszach, w których musimy filtrować dane wyjściowe na podstawie błędów lub gdy chcemy odrzucić wszelkie dane wyjściowe związane z błędnymi opisami. Idąc dalej, przyjrzymy się przykładom jego użycia w systemie Ubuntu.

Używając 2>/dev/null

Ponieważ wiemy, że polecenie 2>/dev/null służy do usuwania błędów, zawsze będzie używane w połączeniu z innymi poleceniami. Podobne podejście zobaczymy w poniższych przykładach. Możesz otworzyć terminal, uzyskując do niego dostęp za pośrednictwem menu aplikacji lub używając skrótu klawiaturowego Ctrl + Alt + T.

W pierwszym przykładzie będziemy wyszukiwać w katalogu /sys/ losowy ciąg (w tym przypadku helloworld). Poleceniem wyszukiwania jest grep, a jego argumentem będzie ciąg wyszukiwania. Wpisz następujące polecenie, aby wyszukać swój ciąg.

$chwyt -rWitaj świecie/system/

To polecenie wyszukiwania może wyświetlać wiele błędów, ponieważ jest używane bez uprawnień administratora. Wyślemy jego strumień błędów do /dev/null za pomocą polecenia 2>/dev/null, aby odrzucić te błędy.

$chwyt -rWitaj świecie/system/ 2> /dev/zero

Widzimy, że wyjście polecenia jest znacznie schludniejsze i prostsze niż ostatnie. Powodem jest to, że błędy są odrzucane przy użyciu 2> /dev/null, a ponieważ polecenie grep nie mogło znaleźć żadnego pliku pasującego do naszego ciągu „helloworld”, nie pokazuje żadnych danych wyjściowych.

Aby lepiej zrozumieć użycie /dev/null, przyjrzymy się następującemu przykładowi pingowania dowolnej witryny (w naszym przypadku google.com). Możesz pingować google.com, wykonując następujące polecenie:

$świstGoogle com

Jeśli chcemy wykluczyć wszystkie nieudane pingi, możemy użyć polecenia 2>/dev/null:

$świstGoogle com2> /dev/zero

W takim przypadku standardowy strumień błędów (który pokazuje nieudane pingi do google.com) jest wysyłany do urządzenia wirtualnego /dev/null, które je odrzuca.

Jeśli jednak chcemy zobaczyć tylko nieudane pingi, możemy wykonać następujące polecenie:

$świstGoogle com1> /dev/zero

Tutaj wysyłamy standardowy strumień wyjściowy (stdout) do urządzenia /dev/null, które go odrzuca. W związku z tym pozostały nam tylko pingi, które nie dotarły do ​​serwera google.com. Jednak w naszym przypadku nie było nieudanych pingów. Możemy również skierować stdout i stderr do różnych lokalizacji. Jest to przydatne, jeśli chcemy odrzucić dane wyjściowe i przechowywać błędy w dzienniku lub odwrotnie. Możesz uruchomić następujące polecenie, aby zapisać nieudane polecenia ping w dzienniku błędów, odrzucając standardowe wyjście polecenia ping:

$świstGoogle com1> /dev/zero2>error.log

Czasami możesz chcieć pominąć wszystkie dane wyjściowe polecenia (w tym standardowe dane wyjściowe i standardowe błędy). Możemy to osiągnąć, używając urządzenia /dev/null w nieco inny sposób. Możesz wpisać następujące polecenie, aby pominąć wszystkie dane wyjściowe:

$świstGoogle com> /dev/zero2> &1

Zauważ, że kolejność poleceń tutaj jest bardzo ważna. Po wykonaniu polecenia ping „>/dev/null” mówi systemowi, aby pominął wyjście, a „2>&1” kieruje standardowy strumień błędów na standardowe wyjście. W ten sposób wszystkie dane wyjściowe polecenia są odrzucane.

Wniosek

Przeanalizowaliśmy polecenie 2>/dev/null i proste przykłady w tym artykule i mam nadzieję, że teraz rozumiesz, co robi każdy z nich. To jednak tylko wierzchołek góry lodowej; Urządzenia zerowe są używane na wiele sposobów w programowaniu bash. Niektóre z bardziej zaawansowanych zastosowań obejmują sprawdzanie istnienia plików, automatyzację instalacji pakietów i unikanie uruchamiania skryptów w niechcianych wyjątkach.