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

Co dokładnie robi 2>/dev/null?
Niezależnie od tego, czy jesteś nowym użytkownikiem Linux, czy doświadczonym programistą Bash, jest wysoce prawdopodobne, że spotkałeś Cryptic Command 2>/dev/null. Chociaż to polecenie wygląda technicznie złożone, jego cel jest bardzo prosty. Odnosi się do urządzenia zerowego, które służy do tłumienia wyjść różnych poleceń. Ten artykuł rozbije każdą część polecenia 2>/dev/null, wyjaśnij jego cel i zobacz przykłady tego, jak jest używane.

Urządzenie zerowe - '/dev/null'

Wszystkie systemy oparte na systemie Linux mają funkcję o nazwie urządzenia wirtualne. Te wirtualne urządzenia oddziałują jak rzeczywiste pliki w systemie operacyjnym. Działanie takich urządzeń wirtualnych jest podobne do rzeczywistych urządzeń; Służą do pisania i czytania danych. Główną różnicą między nimi jest to, ż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 czegokolwiek wysłanego do niego i odczytanie końca pliku (EOF). Większość urządzeń wirtualnych jest używana do odczytu danych; Jednak /dev /null jest unikalny, ponieważ służy do tłumienia wszelkich zapisanych do niego danych. Krótko mówiąc, działa jako czarna dziura dla dowolnych danych, które są do niego zapisane w systemach operacyjnych Linux.

Teraz spójrzmy na pozostałe części polecenia 2> /dev /null

Deskryptor pliku - „2”

Każde wykonanie polecenia w 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 z unikalną liczbą całkowitą nieujemną.

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

Warunki techniczne dla standardowych wejściowych, standardowych wyjściowych i standardowych strumieni błędów są odpowiednio stdin, stdout i stderr.

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

Operator przekierowania pliku - '>'

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

Do tej pory zrozumieliśmy cel każdego elementu 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 wyników błędów. Jeśli jednak jesteś doświadczonym weteranem Linuksa, możesz spojrzeć na zawartość pliku /dev /null, uruchamiając następujące polecenie w terminalu:

$ ls -l /dev /null

To polecenie jest zwykle używane w scenariuszach, w których musimy filtrować wyjście na podstawie błędów lub gdy chcemy odrzucić dowolne wyjście powiązane z błędnymi opisami. Idąc dalej, będziemy patrzeć na przykłady jego użycia w systemie Ubuntu.

Za pomocą 2>/dev/null

Ponieważ wiemy, że polecenie 2>/dev/null jest używane do odrzucania błędów, zawsze będzie używane w połączeniu z innymi poleceniami. W następujących przykładach zobaczymy podobne podejście. Możesz otworzyć terminal, uzyskując dostęp do niego za pośrednictwem menu aplikacji lub używając skrótu klawiatury Ctrl + Alt + T.

W pierwszym przykładzie przeprowadzimy wyszukiwanie w katalogu / sys / w poszukiwaniu losowego ciągu (w tym przypadku Helloworld). Poleceniem wyszukiwania jest GREP, a jego argumentem będzie ciąg wyszukiwania. Wprowadź następujące polecenie, aby wyszukać ciąg.

$ grep -r helloworld /sys /

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

$ grep -r helloworld /sys /2> /dev /null

Widzimy, że dane wyjściowe polecenia jest znacznie bardziej znane i prostsze niż ostatnie. Powodem jest to, że błędy są odrzucane za pomocą 2> /dev /null, a ponieważ polecenie GREP nie było w stanie znaleźć żadnego pliku pasującego do naszego ciągu „Helloworld”, nie pokazuje żadnego wyjścia.

Aby lepiej zrozumieć użycie /dev /null, będziemy patrzeć na następujący przykład pingowania dowolnej witryny (Google.com w naszym przypadku). Możesz pingować Google.com, wykonując następujące polecenie:

$ ping Google.com

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

$ ping Google.com 2> /dev /null

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

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

$ ping Google.com 1> /dev /null

Tutaj wysyłamy standardowy strumień wyjściowy (stdout) do urządzenia /dev /null, które go odrzuca. W konsekwencji pozostało nam tylko pings, które nie dotarły do ​​Google.serwer 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 pomocne, jeśli chcemy odrzucić dane wyjściowe i przechowywać błędy w dzienniku lub odwrotnie. Możesz uruchomić następujące polecenie, aby przechowywać nieudane ping w dzienniku błędów, jednocześnie odrzucając standardowe wyjście polecenia ping:

$ ping Google.com 1> /dev /null 2> błąd.dziennik

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

$ ping Google.com>/dev/null 2> i 1

Zauważ, że kolejność poleceń tutaj jest bardzo ważna. Po wykonaniu polecenia ping '>/dev/null' mówi systemowi, aby stłumił wyjście, a „2> i 1” kieruje standardowym strumieniem błędu do standardowego wyjścia. W ten sposób wszystkie dane wyjściowe polecenia są odrzucane.

Wniosek

Wyróżniliśmy polecenie 2>/dev/null i proste przykłady w tym artykule, i mam nadzieję, że teraz rozumiesz, co robi każdy kawałek. Jest 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, automatyza.