Il reindirizzamento di input e output è una funzione naturale di qualsiasi linguaggio di programmazione o di scripting. Tecnicamente, accade intrinsecamente ogni volta che interagisci con un computer. L'input viene letto da stdin
(input standard, di solito la tastiera o il mouse), l'output va a stdout
(output standard, un flusso di testo o di dati) e gli errori vengono inviati a stderr
. Comprendere l'esistenza di questi flussi di dati ti consente di controllare dove vanno le informazioni quando utilizzi una shell, come Bash o Zsh.
Standard in, standard out e standard error esistono come posizioni del filesystem su Linux. Puoi vederli in /dev
:
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
Non puoi fare molto con loro direttamente, ma a volte è utile pensarli come meta-localizzazioni a cui puoi inviare dati.
Le basi del reindirizzamento sono semplici:usa un certo numero di >
caratteri per reindirizzare l'output e un certo numero di <
caratteri per reindirizzare l'input.
Reindirizzamento dell'output
Per scrivere l'output del comando ls in un file:
$ ls > list.txt
Non vedi l'output di ls
come faresti normalmente, perché l'output viene scritto in list.txt
file invece del tuo schermo. Questo è così versatile, infatti, che puoi persino usarlo per copiare il contenuto di un file in un altro. Non deve essere nemmeno un file di testo. Puoi utilizzare il reindirizzamento per i dati binari:
$ cat image.png > picture.png
(Nel caso ti stia chiedendo perché mai vorresti farlo, è per una ripercussione a volte utile sui permessi dei file.)
Reindirizzamento dell'input
Puoi anche reindirizzare l'input "in" un comando. Questo è probabilmente meno utile del reindirizzamento dell'output perché molti comandi sono già codificati per ricevere input da un argomento fornito. Può essere utile, tuttavia, quando un comando si aspetta un elenco di argomenti e hai quegli argomenti in un file e vuoi "copiarli e incollarli" rapidamente dal file nel tuo terminale (tranne che in realtà non vuoi copiare e incolla):
$ sudo dnf install $(<package.list)
Gli usi comuni del reindirizzamento dell'input sono il here-document (o semplicemente qui-doc in breve) e qui-string tecniche. Questo metodo di input reindirizza un blocco di testo nel flusso di input standard, fino a uno speciale indicatore di fine file (la maggior parte delle persone usa EOF
, ma può essere qualsiasi stringa che si prevede sia univoca). Prova a digitarlo (fino alla seconda istanza di EOF
) in un terminale:
$ echo << EOF
> foo
> bar
> baz
> EOF
Il risultato atteso:
foo
bar
baz
Un qui-documento è un trucco comune utilizzato dagli scripter di Bash per scaricare diverse righe di testo in un file o sullo schermo. Finché non ti dimentichi di terminare la clausola con l'indicatore di fine file, è un modo efficace per evitare elenchi ingombranti di echo
o printf
dichiarazioni.
Una stringa qui è simile a un qui-doc , ma è costituito da una sola stringa (o più stringhe mascherate da un'unica stringa tra virgolette):
$ cat <<< "foo bar baz"
foo bar baz
Reindirizzamento dei messaggi di errore
I messaggi di errore vanno a uno stream chiamato stderr
, designato come 2>
ai fini del reindirizzamento. Questo comando indirizza i messaggi di errore a un file chiamato output.log
:
$ ls /nope 2> output.log
Invio di dati a /dev/null
Altro su Bash
- Cheat sheet di Bash
- Un'introduzione alla programmazione con Bash
- Una guida per l'amministratore di sistema allo scripting Bash
- Ultimi articoli di Bash
Così come esistono posizioni per ingresso standard, uscita standard ed errore, esiste anche una posizione per nessun luogo sul filesystem Linux. Si chiama null
e si trova in /dev
, quindi è spesso pronunciato "devnull" da persone che lo usano troppo frequentemente per dire "slash dev slash null".
Puoi inviare dati a /dev/null
usando il reindirizzamento. Ad esempio, il find
il comando tende a essere dettagliato e spesso segnala conflitti di autorizzazione durante la ricerca nei file:
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
Il find
il comando lo elabora come un errore, quindi puoi reindirizzare solo i messaggi di errore a /dev/null
:
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
Utilizzo del reindirizzamento
Il reindirizzamento è un modo efficiente per ottenere dati da un luogo all'altro in Bash. Potresti non usare il reindirizzamento tutto il tempo, ma imparare a usarlo quando ne hai bisogno può farti risparmiare un sacco di inutili file di apertura e copia e incolla di dati, che generalmente richiedono il movimento del mouse e molte pressioni di tasti. Non ricorrere a tali estremi. Vivi una bella vita e usa il reindirizzamento.