Unix / Linux - Reindirizzamenti di input / output della shell
In questo capitolo, discuteremo in dettaglio sulle redirezioni input / output della Shell. La maggior parte dei comandi di sistema Unix prendono l'input dal tuo terminale e rimandano l'output risultante al tuo terminale. Un comando normalmente legge il suo input dallo standard input, che per impostazione predefinita è il tuo terminale. Allo stesso modo, un comando normalmente scrive il suo output sullo standard output, che è di nuovo il tuo terminale per impostazione predefinita.
Reindirizzamento dell'output
L'output di un comando normalmente inteso per lo standard output può essere facilmente deviato in un file. Questa funzionalità è nota come reindirizzamento dell'output.
Se la notazione> file viene aggiunta a qualsiasi comando che normalmente scrive il suo output sullo standard output, l'output di quel comando verrà scritto su file invece che sul tuo terminale.
Controlla quanto segue who comando che reindirizza l'output completo del comando nel file degli utenti.
$ who > users
Notare che nessun output appare sul terminale. Questo perché l'output è stato reindirizzato dal dispositivo di output standard predefinito (il terminale) nel file specificato. Puoi controllare il file degli utenti per il contenuto completo -
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
Se un comando ha il suo output reindirizzato a un file e il file contiene già alcuni dati, quei dati andranno persi. Considera il seguente esempio:
$ echo line 1 > users
$ cat users
line 1
$
È possibile utilizzare l'operatore >> per aggiungere l'output in un file esistente come segue:
$ echo line 2 >> users
$ cat users
line 1
line 2
$
Reindirizzamento dell'input
Proprio come l'output di un comando può essere reindirizzato a un file, così l'input di un comando può essere reindirizzato da un file. Come lagreater-than character > viene utilizzato per il reindirizzamento dell'output, il file less-than character < viene utilizzato per reindirizzare l'input di un comando.
I comandi che normalmente prendono il loro input dallo standard input possono avere il loro input reindirizzato da un file in questo modo. Ad esempio, per contare il numero di righe nel file che gli utenti hanno generato sopra, puoi eseguire il comando come segue:
$ wc -l users
2 users
$
Dopo l'esecuzione, riceverai il seguente output. È possibile contare il numero di righe nel file reindirizzando lo standard input del filewccomando dal file users -
$ wc -l < users
2
$
Notare che c'è una differenza nell'output prodotto dalle due forme del comando wc. Nel primo caso, il nome del file utenti è elencato con il conteggio delle righe; nel secondo caso non lo è.
Nel primo caso, wc sa che sta leggendo il suo input dagli utenti del file. Nel secondo caso, sa solo che sta leggendo il suo input dallo standard input, quindi non mostra il nome del file.
Qui documento
UN here document viene utilizzato per reindirizzare l'input in uno script o programma di shell interattivo.
È possibile eseguire un programma interattivo all'interno di uno script di shell senza l'intervento dell'utente fornendo l'input richiesto per il programma interattivo o uno script di shell interattivo.
La forma generale per a here il documento è -
command << delimiter
document
delimiter
Qui la shell interpreta il file <<come istruzione per leggere l'input finché non trova una riga contenente il delimitatore specificato. Tutte le righe di input fino alla riga contenente il delimitatore vengono quindi inserite nello standard input del comando.
Il delimitatore dice alla shell che il file heredocumento è stato completato. Senza di esso, la shell continua a leggere l'input per sempre. Il delimitatore deve essere una singola parola che non contiene spazi o tabulazioni.
Di seguito è riportato l'input per il comando wc -l per contare il numero totale di righe -
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
Puoi usare il file here document per stampare più righe usando il tuo script come segue:
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
Dopo l'esecuzione, riceverai il seguente risultato:
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
Il seguente script esegue una sessione con il vi editor di testo e salva l'input nel file test.txt.
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
Se esegui questo script con vim che funge da vi, probabilmente vedrai un output come il seguente:
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
Dopo aver eseguito lo script, dovresti vedere quanto segue aggiunto al file test.txt -
$ cat test.txt
This file was created automatically from
a shell script
$
Elimina l'output
A volte sarà necessario eseguire un comando, ma non si desidera che l'output venga visualizzato sullo schermo. In questi casi, è possibile eliminare l'output reindirizzandolo al file/dev/null -
$ command > /dev/null
Qui comando è il nome del comando che vuoi eseguire. Il file/dev/null è un file speciale che scarta automaticamente tutto il suo input.
Per eliminare sia l'output di un comando che il suo output di errore, utilizzare il reindirizzamento standard per il reindirizzamento STDERR per STDOUT -
$ command > /dev/null 2>&1
Qui 2 rappresenta STDERR e 1 rappresenta STDOUT. È possibile visualizzare un messaggio su STDERR reindirizzando STDOUT in STDERR come segue:
$ echo message 1>&2
Comandi di reindirizzamento
Di seguito è riportato un elenco completo di comandi che è possibile utilizzare per il reindirizzamento:
Sr.No. | Comando e descrizione |
---|---|
1 | pgm > file L'output di pgm viene reindirizzato al file |
2 | pgm < file Il programma pgm legge il suo input dal file |
3 | pgm >> file L'output di pgm viene aggiunto al file |
4 | n > file Uscita dal flusso con descrittore n reindirizzato a file |
5 | n >> file Uscita dal flusso con descrittore n aggiunto al file |
6 | n >& m Unisce l'output dal flusso n con il flusso m |
7 | n <& m Unisce l'input dallo stream n con il flusso m |
8 | << tag L'input standard arriva da qui al tag successivo all'inizio della riga |
9 | | Prende l'output da un programma o processo e lo invia a un altro |
Notare che il descrittore di file 0 è normalmente lo standard input (STDIN), 1 è l'output standard (STDOUT) e 2 è l'output di errore standard (STDERR).