Linux on mielenkiintoinen käyttöjärjestelmä, joka isännöi joitakin virtuaalilaitteita lukuisiin tarkoituksiin. Järjestelmässä toimivien ohjelmien kannalta nämä virtuaalilaitteet toimivat ikään kuin ne olisivat oikeita tiedostoja. Työkalut voivat pyytää ja syöttää tietoja näistä lähteistä. Käyttöjärjestelmä tuottaa tiedot sen sijaan, että se lukisi ne levyltä.

Yksi tällainen esimerkki on /dev/null. Se on erityinen tiedosto, joka on jokaisessa Linux-järjestelmässä. Toisin kuin useimmat muut virtuaalitiedostot, sitä käytetään kuitenkin lukemisen sijaan kirjoittamiseen. Kaikki, mitä kirjoitat /dev/null-tiedostoon, hävitetään, unohdetaan tyhjyyteen. Se tunnetaan UNIX-järjestelmässä nimellä null-laite.

Miksi haluaisit hävittää jotain tyhjyyteen? Tutustutaanpa siihen, mikä /dev/null on ja mikä sen käyttö on.

Edellytykset

Ennen kuin sukellamme syvälle /dev/null:n käyttöön, meidän on oltava selvillä stdout- ja stderr-tietovirroista. Tutustu tähän syväluotaavaan oppaaseen stdinistä, stderristä ja stdoutista.

Tehdäänpä pikainen päivitys. Aina kun jokin komentorivin apuohjelma ajetaan, se tuottaa kaksi ulostuloa. Lähtö menee stdoutiin ja virhe (jos se syntyy) menee stderriin. Oletusarvoisesti nämä molemmat tietovirrat on liitetty päätelaitteeseen.

Esimerkiksi seuraava komento tulostaa kaksoisten lainausmerkkien sisällä olevan merkkijonon. Tässä tuloste tallennetaan stdoutiin.

$ echo ”Hello World”

Seuraava komento näyttää meille aiemmin suoritetun komennon poistumistilan.

$ echo $?

Koska edellinen komento suoritettiin onnistuneesti, poistumistila on 0. Muussa tapauksessa poistumistila on eri. Mitä tapahtuu, kun yrität suorittaa virheellisen komennon?

$ adfadsf
$ echo $?

Nyt meidän on tiedettävä tiedoston kuvaaja. UNIX-ekosysteemissä nämä ovat tiedostolle annettuja kokonaislukuarvoja. Sekä stdoutilla (file descriptor = 1) että stderrillä (file descriptor = 2) on tietty tiedostokuvaaja. Tiedoston kuvaajan (tässä tilanteessa 1 ja 2) avulla voimme ohjata stdoutin ja stderrin muihin tiedostoihin.

Alkajaisiksi seuraava esimerkki ohjaa echo-komennon stdoutin tekstitiedostoon. Tässä emme määrittäneet tiedoston kuvaajaa. Jos sitä ei määritetä, bash käyttää oletusarvoisesti stdoutia.

$ echo ”Hello World” > log.txt

Seuraava komento ohjaa stderr:n tekstitiedostoon.

$ asdfadsa 2> error.txt

Käyttämällä /dev/null

Tulosteen ohjaaminen /dev/null:iin

Nyt ollaan valmiita opettelemaan /dev/null:n käyttöä. Tarkistetaan ensin, miten suodatetaan normaali- ja virhetulosteet. Seuraavassa komennossa grep yrittää etsiä merkkijonoa (tässä tapauksessa hello) hakemistosta ”/sys”.

$ grep -r hello /sys/

Mutta se tuottaa paljon virheitä, sillä ilman pääkäyttäjän oikeuksia grep ei pääse käsiksi moniin tiedostoihin. Tällaisessa tapauksessa se aiheuttaa ”Permission denied” -virheitä. Nyt uudelleenohjauksen avulla saamme selkeämmän tulosteen.

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

Tuloste näyttää paljon paremmalta, eikö? Ei mitään! Tässä tapauksessa grep ei pääse käsiksi moniin tiedostoihin, ja niissä, joihin pääsee käsiksi, ei ole merkkijonoa ”hello”.

Seuraavassa esimerkissä pingaamme Googlea.

$ ping google.com

Emmekä kuitenkaan halua nähdä kaikkia näitä onnistuneita ping-tuloksia. Sen sijaan haluamme keskittyä vain virheisiin, kun ping ei tavoittanut Googlea. Miten teemme sen?

$ ping google.com 1> /dev/null

Tässä stdoutin sisältö dumppataan /dev/null:iin, jolloin jäljelle jäävät vain virheet.

Ohjata kaikki tulosteet /dev/null:iin

Tietyissä tilanteissa tulosteet saattavat olla hyödyttömiä. Uudelleenohjauksen avulla voimme dumpata kaikki tulosteet tyhjään tilaan.

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

Rikotaan tätä komentoa hieman. Ensin dumppaamme kaiken stdoutin tiedostoon /dev/null. Sitten toisessa osassa käskemme bashia lähettämään stderr:n stdoutiin. Tässä esimerkissä ei ole mitään tulostettavaa. Jos olet kuitenkin hämmentynyt, voit aina tarkistaa, suoritettiinko komento onnistuneesti.

$ echo $?

Arvo on 2, koska komento tuotti paljon virheitä.

Jos sinulla on tapana unohtaa stdout- ja stderr-tiedoston kuvaaja, seuraava komento riittää hyvin. Se on edellisen komennon yleistynyt muoto. Sekä stdout että stderr ohjataan osoitteeseen /dev/null.

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

Muut esimerkit

Tämä on mielenkiintoinen. Muistatko dd-työkalun? Se on tehokas työkalu tiedostojen muuntamiseen ja kopioimiseen. Lue lisää dd:stä. Käyttämällä dd:tä voimme testata levyn peräkkäistä lukunopeutta. Se ei tietenkään ole tarkka mittaus. Nopeaa testiä varten se on kuitenkin melko käyttökelpoinen.

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

Tässä käytin isona tiedostona Ubuntu 18.04.4 ISO-ohjelmaa.

Voit myös testata internetyhteytesi latausnopeutta.

$ wget -O /dev/null <big_file_link>

Loppuajatuksia

Toivottavasti sinulla on selkeä käsitys siitä, mikä tämä /dev/null-tiedosto on. Se on erikoislaite, joka, jos siihen kirjoitetaan, hylkää ja jos siitä luetaan, lukee nollaa. Tämän mielenkiintoisen ominaisuuden todellinen potentiaali on mielenkiintoisissa bash-skripteissä.

Oletko kiinnostunut bash-skripteistä? Tutustu bash-skriptauksen aloittelijan oppaaseen.

Iloa!

Vastaa

Sähköpostiosoitettasi ei julkaista.