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.
Następne polecenie pokaże nam status wyjścia poprzednio uruchomionego polecenia.
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?
$ 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.
Następujące polecenie przekieruje stderr do pliku tekstowego.
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”.
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.
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.
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ć?
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.
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.
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.
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.
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.
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!