Linux je zajímavý operační systém, který obsahuje některá virtuální zařízení pro různé účely. Co se týče programů běžících v systému, chovají se tato virtuální zařízení jako skutečné soubory. Nástroje mohou z těchto zdrojů požadovat a přivádět data. Data jsou generována operačním systémem namísto jejich čtení z disku.
Jedním z takových příkladů je /dev/null. Je to speciální soubor, který je přítomen v každém jednotlivém systému Linux. Na rozdíl od většiny ostatních virtuálních souborů však místo čtení slouží k zápisu. Cokoli zapíšete do /dev/null, bude zahozeno, zapomenuto do prázdna. V systému UNIX se mu říká zařízení null.
Proč byste chtěli něco zahodit do prázdna? Podívejme se, co je /dev/null a jaké je jeho použití.
Předpoklady
Než se ponoříme do hloubky použití /dev/null, musíme mít jasnou představu o datovém toku stdout a stderr. Podívejte se na tuto podrobnou příručku o stdin, stderr a stdout.
Představíme si rychlé osvěžení. Kdykoli je spuštěn jakýkoli nástroj příkazového řádku, generuje dva výstupy. Výstup jde na stdout a chyba (pokud je generována) jde na stderr. Ve výchozím nastavení jsou oba tyto datové toky spojeny s terminálem.
Například následující příkaz vypíše řetězec uvnitř dvojité uvozovky. Zde je výstup uložen do stdout.
Další příkaz nám ukáže stav ukončení dříve spuštěného příkazu.
Jelikož předchozí příkaz proběhl úspěšně, stav ukončení je 0. V opačném případě bude stav ukončení jiný. Co se stane, když se pokusíte spustit neplatný příkaz?
$ echo $?
Nyní potřebujeme vědět něco o deskriptoru souboru. V ekosystému UNIX se jedná o celočíselné hodnoty přiřazené souboru. Jak stdout (deskriptor souboru = 1), tak stderr (deskriptor souboru = 2) mají specifický deskriptor souboru. Pomocí deskriptoru souboru (v této situaci 1 a 2) můžeme přesměrovat stdout a stderr do jiných souborů.
Pro začátek následující příklad přesměruje stdout příkazu echo do textového souboru. Zde jsme nezadali deskriptor souboru. Pokud není zadán, bash standardně použije stdout.
Následující příkaz přesměruje stderr do textového souboru.
Použití /dev/null
Přesměrování výstupu do /dev/null
Nyní jsme připraveni naučit se používat /dev/null. Nejprve se podíváme, jak filtrovat normální a chybový výstup. V následujícím příkazu se grep pokusí vyhledat řetězec (v tomto případě hello) v adresáři „/sys“.
Vygeneruje však spoustu chyb, protože bez práv roota nemá grep přístup k řadě souborů. V takovém případě to bude mít za následek chyby „Oprávnění odepřeno“. Nyní můžeme pomocí přesměrování získat přehlednější výstup.
Výstup vypadá mnohem lépe, že? Nic! V tomto případě grep nemá přístup k mnoha souborům a ty, které jsou přístupné, neobsahují řetězec „hello“.
V následujícím příkladu budeme pingovat Google.
Nechceme však vidět všechny tyto úspěšné výsledky pingu. Místo toho se chceme zaměřit pouze na chyby, kdy se ping nemohl spojit se společností Google. Jak to uděláme?
Zde je obsah stdout vyhozen do /dev/null a zůstávají pouze chyby.
Přesměrovat veškerý výstup do /dev/null
V určitých situacích nemusí být výstup vůbec užitečný. Pomocí přesměrování můžeme veškerý výstup vysypat do prázdna.
Nechme tento příkaz trochu porušit. Nejprve vysypeme celý stdout do /dev/null. Pak ve druhé části řekneme bash, aby odeslal stderr na stdout. V tomto příkladu není co vypisovat. Pokud jste však zmateni, můžete si vždy ověřit, zda příkaz proběhl úspěšně.
Hodnota je 2, protože příkaz vygeneroval spoustu chyb.
Pokud máte tendenci zapomínat na deskriptor souborů stdout a stderr, následující příkaz vám bude stačit. Jedná se o obecnější formát předchozího příkazu. Jak stdout, tak stderr budou přesměrovány do /dev/null.
Další příklady
Tento je zajímavý. Vzpomínáte si na nástroj dd? Je to mocný nástroj pro převod a kopírování souborů. Přečtěte si více informací o nástroji dd. Pomocí nástroje dd můžeme otestovat rychlost sekvenčního čtení disku. Samozřejmě to není přesné měření. Pro rychlý test je to však docela užitečné.
Zde jsem jako velký soubor použil Ubuntu 18.04.4 ISO.
Podobně můžete vyzkoušet i rychlost stahování vašeho internetového připojení.
Závěrečné myšlenky
Snad už máte jasno, co je to ten soubor /dev/null. Je to speciální zařízení, které, pokud se do něj zapisuje, zahazuje a pokud se z něj čte, čte null. Skutečný potenciál této zajímavé funkce se skrývá v zajímavých skriptech bashe.
Zajímá vás skriptování v bashi? Podívejte se na průvodce skriptováním v bashi pro začátečníky.
Užijte si to!