A Linux egy érdekes operációs rendszer, amely számos célt szolgál néhány virtuális eszközzel. A rendszerben futó programok szempontjából ezek a virtuális eszközök úgy viselkednek, mintha valódi fájlok lennének. Az eszközök adatokat kérhetnek és táplálhatnak ezekből a forrásokból. Az adatokat az operációs rendszer generálja ahelyett, hogy lemezről olvasná be őket.

Egy ilyen példa a /dev/null. Ez egy speciális fájl, amely minden egyes Linux rendszerben jelen van. A legtöbb más virtuális fájltól eltérően azonban olvasás helyett írásra használják. Bármit is írsz a /dev/null fájlba, az eldobásra kerül, elfelejtődik a semmibe. UNIX rendszerben null eszközként ismert.

Miért akarsz valamit az ürességbe dobni? Nézzük meg, mi az a /dev/null és mi a használata.

Előfeltételek

Mielőtt mélyen belemerülnénk a /dev/null használatába, tisztában kell lennünk az stdout és az stderr adatfolyamokkal. Tekintse meg ezt a mélyreható útmutatót az stdin, stderr és stdout adatfolyamokról.

Legyen egy gyors frissítés. Bármely parancssoros segédprogram futtatásakor két kimenetet generál. A kimenet az stdout-ra, a hiba (ha keletkezik) pedig az stderr-re kerül. Alapértelmezés szerint mindkét adatfolyam a terminálhoz van rendelve.

A következő parancs például kiírja a kettős idézőjelben lévő karakterláncot. Itt a kimenet az stdout-ban tárolódik.

$ echo “Hello World”

A következő parancs megmutatja nekünk az előzőleg lefuttatott parancs kilépési állapotát.

$ echo $?

Mivel az előző parancs sikeresen lefutott, a kilépési állapot 0. Ellenkező esetben a kilépési állapot más lesz. Mi történik, ha érvénytelen parancsot próbál futtatni?

$ adfadsf
$ echo $?

Most a fájlleíróról kell tudnunk. A UNIX ökoszisztémában ezek a fájlhoz rendelt egész számértékek. Mind az stdout (file descriptor = 1), mind az stderr (file descriptor = 2) rendelkezik egy adott file descriptorral. A fájlleíró (ebben a helyzetben 1 és 2) segítségével átirányíthatjuk az stdoutot és az stderr-t más fájlba.

A következő példa például az echo parancs stdoutját egy szöveges fájlba irányítja át. Itt nem adtuk meg a fájlleírót. Ha nincs megadva, a bash alapértelmezés szerint az stdoutot használja.

$ echo “Hello World” > log.txt

A következő parancs az stderr-t egy szöveges fájlba irányítja át.

$ asdfadsa 2> error.txt

A /dev/null használata

A kimenet átirányítása a /dev/null fájlba

Most készen állunk arra, hogy megtanuljuk a /dev/null használatát. Először is nézzük meg, hogyan szűrjük a normál kimenetet és a hibát. A következő parancsban a grep megpróbál megkeresni egy sztringet (jelen esetben hello) a “/sys” könyvtárban.

$ grep -r hello /sys/

Mégis rengeteg hibát fog generálni, mivel root jogosultság nélkül a grep nem tud hozzáférni számos fájlhoz. Ilyen esetben “Permission denied” hibát fog eredményezni. Most, az átirányítás használatával tisztább kimenetet kapunk.

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

A kimenet sokkal jobban néz ki, igaz? Semmi! Ebben az esetben a grep nem sok fájlhoz fér hozzá, és azokban, amelyekhez hozzáférhetünk, nem szerepel a “hello” karakterlánc.

A következő példában a Google-t fogjuk pingelni.

$ ping google.com

Nem akarjuk azonban látni az összes sikeres ping eredményt. Ehelyett csak azokra a hibákra szeretnénk koncentrálni, amikor a ping nem tudta elérni a Google-t. Hogyan csináljuk ezt?

$ ping google.com 1> /dev/null

Itt a stdout tartalma a /dev/null-ba kerül, így csak a hibák maradnak.

Az összes kimenet átirányítása a /dev/null-ba

Bizonyos helyzetekben a kimenet egyáltalán nem hasznos. Az átirányítással az összes kimenetet a semmibe dobhatjuk.

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

Törjük meg egy kicsit ezt a parancsot. Először is, az összes stdoutot a /dev/null-ba dömpingeljük. Aztán a második részben megmondjuk a bash-nek, hogy az stderr-t küldje az stdout-ra. Ebben a példában nincs mit kiadni. Ha azonban zavarban vagy, bármikor ellenőrizheted, hogy a parancs sikeresen lefutott-e.

$ echo $?

Az érték 2, mert a parancs sok hibát generált.

Ha hajlamos vagy elfelejteni az stdout és az stderr fájlleíróját, a következő parancs is megteszi. Ez az előző parancs általánosítottabb formátuma. Mind az stdout, mind az stderr át lesz irányítva a /dev/null könyvtárba.

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

Más példák

Ez egy érdekes példa. Emlékszel a dd eszközre? Ez egy hatékony eszköz fájlok konvertálására és másolására. Tudjon meg többet a dd-ről. A dd segítségével tesztelhetjük a lemez szekvenciális olvasási sebességét. Természetesen ez nem egy pontos mérés. Azonban egy gyors teszthez elég hasznos.

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

Itt az Ubuntu 18.04.4 ISO-t használtam nagy fájlként.

Hasonlóképpen tesztelheted az internetkapcsolatod letöltési sebességét is.

$ wget -O /dev/null <big_file_link>

Végső gondolatok

Remélhetőleg tisztában vagy azzal, hogy mi ez a /dev/null fájl. Ez egy speciális eszköz, amely, ha írunk rá, eldobja, ha pedig olvasunk belőle, akkor nullát olvas. Ennek az érdekes funkciónak az igazi potenciálja az érdekes bash szkriptekben rejlik.

Interdekel a bash szkriptírás? Nézd meg a kezdő bash szkriptírás útmutatóját.

Kellemes szórakozást!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.