logo

Co to jest /Dev/Null w systemie Linux?

Jeśli uczysz się programowania w powłoce, być może natknąłeś się już na coś takiego jak /dev/null. W tym artykule zrozumiemy, co to jest i jak się z niego korzysta. Zacznijmy od zrozumienia, czym jest /dev.

Co to jest /dev?

W systemie plików Linux wszystko jest plikiem lub katalogiem. Nawet urządzenia są dostępne jako pliki. Partycje dysku twardego, pendrive, głośniki, dla tego wszystkiego istnieje plik, z którego można uzyskać do nich dostęp. Aby zrozumieć, w jaki sposób urządzenia są dostępne w postaci plików, pomyśl o tym w ten sposób: co robimy z plikiem? Odczytujemy z niego dane i zapisujemy do niego dane. Urządzenie takie jak głośnik może wprowadzać dane w celu wytworzenia dźwięku, dysk twardy może służyć do odczytywania i zapisywania danych, drukarka pobiera dane wejściowe, aby drukować pliki itp. Pliki i urządzenia są pod tym względem podobne

/dev to katalog, w którym przechowywane są wszystkie fizyczne i wirtualne urządzenia systemu Linux. Urządzenia fizyczne są łatwe do zrozumienia, są to urządzenia materialne, takie jak pendrive, głośniki, drukarki itp. System Linux ma również urządzenia wirtualne, które działają jak urządzenie, ale nie reprezentują urządzenia fizycznego.



Co to jest /dev/null?

Jest to urządzenie wirtualne, które ma specjalną właściwość: wszelkie dane zapisane w /dev/null znikają lub znikają. Ze względu na tę cechę nazywany jest również bitbucketem lub czarną dziurą. Zobaczmy demonstrację.

Przekieruj wyjście do /dev/null

W tym demo widać, że dodaliśmy pewne dane, ale nie zostały one zapisane. Ta szczególna cecha /dev/null ma kilka przypadków użycia. Zobaczmy je.

Użycie /dev/null

Ponieważ odrzuca wszystko, co zostało do niego zapisane, możesz przenieść pliki do /dev/null, aby je usunąć. Ale nie jest to powszechnie stosowany przypadek użycia. Służy głównie do odrzucania standardowego wyjścia i standardowego błędu z wyjścia.

Co to jest standardowe wyjście i błąd standardowy?

Dane wyjściowe polecenia systemu Linux zawierają dwa strumienie danych: standardowe wyjście (stdout) i standardowe wyjście błędu (stderr0), natomiast standardowe wyjście to normalne wyjście, jeśli polecenie nie zawiera błędów, błąd standardowy to błąd wygenerowany przez polecenie. Dane wyjściowe mogą zawierać zarówno standardowe wyjście, jak i standardowe wejście. Przykład stdout i stderr:

Uruchommy następujący skrypt powłoki

# /bin/sh ls apt update>

Pierwsze polecenie zostało wykonane pomyślnie, ale drugie wygenerowało błąd. Ponieważ stdout i stderr są dwoma oddzielnymi strumieniami danych, można je obsługiwać oddzielnie.

Jak uzyskać dostęp do stderr i stdout?

Stdout i stderr to strumienie danych, które w systemie Linux są traktowane jak plik. Jeśli chcesz wykonać na nich jakąkolwiek akcję, użyj deskryptora pliku, który jednoznacznie identyfikuje strumień pliku. Deskryptor pliku dla stdout to 1, a dla stderr to 2.

Aby uzyskać do nich dostęp oddzielnie, spójrzmy na następujące polecenie wykonywane na tym samym pliku skryptu, który został użyty w poprzednim przykładzie.

./script.sh 1>stdout.txt>

Widać na tym, że dane wyjściowe zawierają standardowe błędy, ale standardowe wyjście nie zostało wyświetlone. Dzieje się tak, ponieważ strumień stdout został wysłany do pliku stdout.txt i widać, że plik stdout.txt zawiera standardowe wyjście.

Pisząc skrypt powłoki, możemy chcieć odrzucić standardowy błąd z danych wyjściowych. Niezależnie od strumienia, który chcielibyśmy usunąć z danych wyjściowych, ten strumień danych można zapisać w /dev/null. Możesz zapisać te dane w innym pliku, tak jak w powyższym przykładzie, ale jeśli nie potrzebujesz tych danych, dlaczego chcesz marnować na nie pamięć, lepiej je całkowicie wyrzucić. Zobaczmy następujący przykład

./script.sh 2>/dev/null>

I tak po prostu usunęliśmy stderr z wyjścia. Jeśli chcesz odrzucić całe dane wyjściowe, możesz użyć następującego polecenia

command>/dev/null 2>&1>

Polecenie &> przekierowuje wyjście deskryptora pliku wymienionego po lewej stronie (w powyższym poleceniu wyjście 2) do strumienia deskryptora pliku wymienionego po prawej stronie. Zatem wyjście stderr (2) zostaje przekierowane na stdout(1), które z kolei zostaje zapisane w /dev/null i w ten sposób zostaje zniszczone.

Bezpieczne usuwanie plików

„/dev/null” znajduje zastosowanie w bezpiecznym usuwaniu plików. Przekierowując „/dev/null” do pliku, możesz skutecznie nadpisać jego zawartość bajtami zerowymi, co utrudnia odzyskanie jakichkolwiek znaczących danych.

Na przykład:

cat /dev/null>plik_wrażliwy>

To polecenie zastępuje zawartość „pliku_wrażliwego” bajtami zerowymi, zapewniając jego bezpieczne usunięcie.

Czyszczenie plików dziennika

Pliki dziennika mogą z czasem gromadzić znaczne ilości danych. Aby wyczyścić pliki dziennika bez przerywania działania usług, możesz przekierować ich zawartość do „/dev/null”.

Na przykład:

cat /dev/null>/var/log/syslog>

To polecenie opróżnia plik „syslog”, przekierowując jego zawartość do „/dev/null”, skutecznie czyszcząc dziennik bez usuwania samego pliku.

Porady i wskazówki:

  • Przekierowanie standardowego wyjścia do „/dev/null”: „polecenie> /dev/null”
  • Przekierowanie błędu standardowego do „/dev/null”: „polecenie 2> /dev/null”
  • Przekierowanie zarówno wyjścia, jak i błędu do „/dev/null”: „polecenie>/dev/null 2>&1”

Wniosek

W tym artykule omówiliśmy, że `/dev/null' w Linuksie to wirtualna czarna dziura, w której dane znikają po zapisaniu. Jest powszechnie używany do odrzucania danych wyjściowych i błędów, dzięki czemu wykonywanie poleceń jest czystsze. Można go również wykorzystać do bezpiecznego usuwania plików i czyszczenia plików dziennika. Zrozumienie jego funkcjonalności pozwala na efektywne wykonywanie operacji z wiersza poleceń w systemie Linux.