GNU/Linux >> Znalost Linux >  >> Linux

Proč je /dev/null soubor? Proč není jeho funkce implementována jako jednoduchý program?

Snažím se pochopit koncept speciálních souborů na Linuxu. Nicméně mít speciální soubor v /dev Zdá se to být hloupé, když by jeho funkce mohla být implementována hrstkou řádků v C, pokud vím.

Navíc byste jej mohli použít v podstatě stejným způsobem, tj. potrubím do null místo přesměrování do /dev/null . Existuje nějaký konkrétní důvod, proč to mít jako soubor? Nezpůsobuje z něj vytvoření souboru mnoho dalších problémů, například příliš mnoho programů, které přistupují ke stejnému souboru?

Přijatá odpověď:

Kromě výkonových výhod používání zařízení se speciálním znakem je hlavní výhodou modularita . /dev/null lze použít téměř v jakémkoli kontextu, kde se očekává soubor, nejen v prostředí shell. Zvažte programy, které přijímají soubory jako parametry příkazového řádku.

# We don't care about log output.
$ frobify --log-file=/dev/null

# We are not interested in the compiled binary, just seeing if there are errors.
$ gcc foo.c -o /dev/null  || echo "foo.c does not compile!".

# Easy way to force an empty list of exceptions.
$ start_firewall --exception_list=/dev/null

To vše jsou případy, kdy by použití programu jako zdroje nebo jímky bylo extrémně těžkopádné. I v případě shell pipeline mohou být stdout a stderr přesměrovány na soubory nezávisle, což je se spustitelnými soubory jako jímkami obtížné:

# Suppress errors, but print output.
$ grep foo * 2>/dev/null

Linux
  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Kdy použít /dev/random vs /dev/urandom?

  3. Proč se přesměrování Stderr na /dev/null provádí tímto způsobem?

  1. Jak kódovat base64 /dev/random nebo /dev/urandom?

  2. Jak spustit soubor sh z jiného souboru sh

  3. Proč mohu přesunout věci do /dev/null, přestože je to pseudozařízení reprezentované souborem?

  1. /dev/sdb:Žádný takový soubor nebo adresář (ale /dev/sdb1 atd. existuje)

  2. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  3. echo nebo print /dev/stdin /dev/stdout /dev/stderr