Linux jest interesującym systemem operacyjnym, który hostuje pewne wirtualne urządzenia dla wielu celów. Jeśli chodzi o programy działające w systemie, te wirtualne urządzenia zachowują się tak, jakby były prawdziwymi plikami. Narzędzia mogą żądać i podawać dane z tych źródeł. Dane są generowane przez system operacyjny zamiast odczytywać je z dysku.

Jednym z takich przykładów jest /dev/null. Jest to specjalny plik, który jest obecny w każdym pojedynczym systemie Linux. Jednakże, w przeciwieństwie do większości innych plików wirtualnych, zamiast do odczytu, służy do zapisu. Cokolwiek napiszesz do /dev/null zostanie wyrzucone, zapomniane w pustce. Jest to znane jako urządzenie null w systemie UNIX.

Dlaczego chciałbyś wyrzucić coś do pustki? Sprawdźmy, czym jest /dev/null i jakie są jego zastosowania.

Wymagania wstępne

Przed zagłębieniem się w zastosowanie /dev/null, musimy mieć jasne pojęcie o strumieniu danych stdout i stderr. Sprawdź ten dogłębny przewodnik na temat stdin, stderr i stdout.

Pozwólmy sobie na szybkie odświeżenie. Kiedykolwiek uruchamiane jest jakiekolwiek narzędzie wiersza poleceń, generuje ono dwa wyjścia. Dane wyjściowe trafiają na stdout, a błąd (jeśli został wygenerowany) na stderr. Domyślnie, oba te strumienie danych są powiązane z terminalem.

Na przykład, poniższe polecenie wypisze łańcuch w podwójnym cudzysłowie. Tutaj dane wyjściowe są przechowywane w stdout.

$ echo „Hello World”

Następne polecenie pokaże nam status wyjścia poprzednio uruchomionego polecenia.

$ echo $?

Jako że poprzednie polecenie wykonało się pomyślnie, status wyjścia wynosi 0. W przeciwnym razie, status wyjścia będzie inny. Co się stanie, gdy spróbujesz uruchomić nieprawidłowe polecenie?

$ adfadsf
$ echo $?

Teraz musimy wiedzieć o deskryptorze pliku. W ekosystemie UNIX-a są to wartości całkowite przypisane do pliku. Zarówno stdout (deskryptor pliku = 1) jak i stderr (deskryptor pliku = 2) mają określony deskryptor pliku. Używając deskryptora pliku (1 i 2 w tej sytuacji), możemy przekierować stdout i stderr do innych plików.

Na początek, poniższy przykład przekieruje stdout polecenia echo do pliku tekstowego. Tutaj, nie określiliśmy deskryptora pliku. Jeśli nie zostanie on określony, bash domyślnie użyje stdout.

$ echo „Hello World” > log.txt

Następujące polecenie przekieruje stderr do pliku tekstowego.

$ asdfadsa 2> error.txt

Używanie /dev/null

Przekierowanie wyjścia do /dev/null

Teraz jesteśmy gotowi, aby dowiedzieć się, jak używać /dev/null. Po pierwsze, sprawdźmy jak filtrować normalne wyjście i błędy. W poniższym poleceniu grep spróbuje wyszukać ciąg znaków (w tym przypadku hello) w katalogu „/sys”.

$ grep -r hello /sys/

Jednakże wygeneruje on wiele błędów, ponieważ bez uprawnień roota, grep nie ma dostępu do wielu plików. W takim przypadku, będzie to skutkowało błędami „Permission denied”. Teraz, używając przekierowania, możemy uzyskać bardziej przejrzyste dane wyjściowe.

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

Wygląda to znacznie lepiej, prawda? Nic! W tym przypadku grep nie ma dostępu do wielu plików, a te, które są dostępne, nie mają łańcucha „hello”.

W następnym przykładzie będziemy pingować Google.

$ ping google.com

Jednakże nie chcemy widzieć wszystkich tych udanych wyników pingowania. Zamiast tego, chcemy skupić się tylko na błędach, gdy ping nie mógł dotrzeć do Google. Jak to zrobić?

$ ping google.com 1> /dev/null

Tutaj zawartość stdout jest wyrzucana do /dev/null, pozostawiając tylko błędy.

Przekieruj wszystkie dane wyjściowe do /dev/null

W pewnych sytuacjach dane wyjściowe mogą nie być w ogóle użyteczne. Używając przekierowania, możemy wyrzucić całe wyjście do pustki.

$ grep -r hello /sys/ > /dev/null 2>&1

Zepsujmy trochę to polecenie. Najpierw wyrzucamy cały stdout do /dev/null. Następnie, w drugiej części, mówimy bashowi, aby wysłał stderr do stdout. W tym przykładzie, nie ma nic do wypisania. Jeśli jednak jesteś zdezorientowany, zawsze możesz sprawdzić, czy polecenie zostało wykonane pomyślnie.

$ echo $?

Wartość wynosi 2, ponieważ polecenie wygenerowało wiele błędów.

Jeśli masz tendencję do zapominania deskryptora pliku stdout i stderr, poniższe polecenie wystarczy. Jest to bardziej uogólniony format poprzedniego polecenia. Zarówno stdout, jak i stderr zostaną przekierowane do /dev/null.

$ grep -r hello /sys/ &> /dev/null

Inne przykłady

To jest interesujące. Pamiętasz narzędzie dd? Jest to potężne narzędzie do konwertowania i kopiowania plików. Dowiedz się więcej o dd. Używając dd, możemy przetestować prędkość odczytu sekwencyjnego twojego dysku. Oczywiście, nie jest to dokładny pomiar. Jednak dla szybkiego testu jest całkiem przydatny.

$ dd if=<big_file> of=/dev/null status=progress bs=1M iflag=direct

Tutaj użyłem Ubuntu 18.04.4 ISO jako dużego pliku.

Podobnie, możesz również przetestować prędkość pobierania swojego połączenia internetowego.

$ wget -O /dev/null <big_file_link>

Ostatnie przemyślenia

Mam nadzieję, że dobrze rozumiesz czym jest plik /dev/null. Jest to specjalne urządzenie, które, jeśli się do niego pisze, odrzuca, a jeśli się z niego czyta, odczytuje null. Prawdziwy potencjał tej ciekawej funkcji tkwi w interesujących skryptach basha.

Interesuje Cię pisanie skryptów basha? Sprawdź przewodnik dla początkujących po skryptach basha.

Baw się dobrze!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.