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.

$ echo „Hello World“

Další příkaz nám ukáže stav ukončení dříve spuštěného příkazu.

$ echo $?

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?

$ adfadsf
$ 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.

$ echo „Hello World“ > log.txt

Následující příkaz přesměruje stderr do textového souboru.

$ asdfadsa 2> error.txt

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“.

$ grep -r hello /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.

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

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.

$ ping google.com

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?

$ ping google.com 1> /dev/null

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.

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

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ě.

$ echo $?

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.

$ grep -r hello /sys/ &> /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é.

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

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í.

$ wget -O /dev/null <big_file_link>

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!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.