Linux è un interessante sistema operativo che ospita alcuni dispositivi virtuali per numerosi scopi. Per quanto riguarda i programmi in esecuzione nel sistema, questi dispositivi virtuali si comportano come se fossero file reali. Gli strumenti possono richiedere e alimentare dati da queste fonti. I dati sono generati dal sistema operativo invece di leggerli da un disco.

Uno di questi esempi è /dev/null. È un file speciale che è presente in ogni singolo sistema Linux. Tuttavia, a differenza della maggior parte degli altri file virtuali, invece di leggere, è usato per scrivere. Qualsiasi cosa si scriva su /dev/null sarà scartata, dimenticata nel vuoto. È conosciuto come il dispositivo null in un sistema UNIX.

Perché vorresti scartare qualcosa nel vuoto? Controlliamo cos’è /dev/null e il suo utilizzo.

Prequisiti

Prima di immergerci nell’utilizzo di /dev/null, dobbiamo avere una chiara comprensione del flusso di dati stdout e stderr. Date un’occhiata a questa guida approfondita su stdin, stderr e stdout.

Facciamo un rapido aggiornamento. Ogni volta che viene eseguita qualsiasi utilità a riga di comando, genera due output. L’output va su stdout e l’errore (se generato) va su stderr. Per impostazione predefinita, entrambi questi flussi di dati sono associati al terminale.

Per esempio, il seguente comando stamperà la stringa all’interno del doppio apice. Qui, l’output è memorizzato in stdout.

$ echo “Hello World”

Il prossimo comando ci mostrerà lo stato di uscita del comando precedentemente eseguito.

$ echo $?

Siccome il comando precedente è stato eseguito con successo, lo stato di uscita è 0. Altrimenti, lo stato di uscita sarà diverso. Cosa succede quando cerchi di eseguire un comando non valido?

$ adfadsf
$ echo $?

Ora dobbiamo conoscere il descrittore di file. Nell’ecosistema UNIX, questi sono valori interi assegnati a un file. Sia stdout (descrittore di file = 1) che stderr (descrittore di file = 2) hanno un descrittore di file specifico. Usando il descrittore di file (1 e 2 in questa situazione), possiamo reindirizzare lo stdout e lo stderr ad altri file.

Per cominciare, il seguente esempio reindirizzerà lo stdout del comando echo a un file di testo. Qui non abbiamo specificato il descrittore del file. Se non specificato, bash userà stdout per default.

$ echo “Hello World” > log.txt

Il seguente comando reindirizzerà lo stderr a un file di testo.

$ asdfadsa 2> error.txt

Usare /dev/null

Ridurre l’output a /dev/null

Ora siamo pronti per imparare come usare /dev/null. Per prima cosa, controlliamo come filtrare l’output normale e l’errore. Nel seguente comando, grep proverà a cercare una stringa (hello, in questo caso) nella directory “/sys”.

$ grep -r hello /sys/

Tuttavia, genererà un sacco di errori poiché senza i privilegi di root, grep non può accedere ad un certo numero di file. In tal caso, produrrà un errore “Permesso negato”. Ora, usando il reindirizzamento, possiamo ottenere un output più chiaro.

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

L’output sembra molto meglio, vero? Niente! In questo caso, grep non ha accesso a molti file e quelli accessibili non hanno la stringa “hello”.

Nell’esempio seguente, faremo un ping a Google.

$ ping google.com

Tuttavia, non vogliamo vedere tutti i risultati dei ping di successo. Invece, vogliamo concentrarci solo sugli errori quando il ping non ha potuto raggiungere Google. Come facciamo?

$ ping google.com 1> /dev/null

Qui, il contenuto di stdout viene scaricato su /dev/null, lasciando solo gli errori.

Ridireziona tutto l’output su /dev/null

In certe situazioni, l’output potrebbe non essere affatto utile. Usando il reindirizzamento, possiamo scaricare tutto l’output nel vuoto.

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

Facciamo una piccola modifica a questo comando. Per prima cosa, scarichiamo tutto lo stdout in /dev/null. Poi, nella seconda parte, stiamo dicendo a bash di inviare stderr a stdout. In questo esempio, non c’è niente da mandare in output. Tuttavia, se sei confuso, puoi sempre controllare se il comando è stato eseguito con successo.

$ echo $?

Il valore è 2 perché il comando ha generato molti errori.

Se si tende a dimenticare il descrittore di file di stdout e stderr, il seguente comando andrà bene. È un formato più generalizzato del comando precedente. Sia stdout che stderr saranno reindirizzati a /dev/null.

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

Altri esempi

Questo è interessante. Ricordate lo strumento dd? È un potente strumento per convertire e copiare file. Per saperne di più su dd. Usando dd, possiamo testare la velocità di lettura sequenziale del vostro disco. Naturalmente, non è una misurazione accurata. Tuttavia, per un test veloce, è abbastanza utile.

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

Qui, ho usato la ISO di Ubuntu 18.04.4 come file grande.

Similmente, puoi anche testare la velocità di download della tua connessione internet.

$ wget -O /dev/null <big_file_link>

Pensieri finali

Spero tu abbia una chiara comprensione di cosa sia questo file /dev/null. È un dispositivo speciale che, se vi si scrive, scarta e se vi si legge, legge null. Il vero potenziale di questa interessante caratteristica è negli interessanti script bash.

Sei interessato allo scripting bash? Date un’occhiata alla guida per principianti allo scripting bash.

Godetevi!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.