<Precedenti | Contenuti | Succ.>
Reindirizzamento dell'output standard
Il reindirizzamento I/O ci consente di ridefinire dove va lo standard output. Per reindirizzare l'output standard su un altro file anziché sullo schermo, utilizziamo l'operatore di reindirizzamento ">" seguito dal nome del file. Perché dovremmo volerlo fare? Spesso è utile memorizzare l'output di un comando in un file. Ad esempio, potremmo dire alla shell di inviare l'output di ls comando al file ls-output.txt al posto dello schermo:
[io@linuxbox~]$ ls -l /usr/bin > ls-output.txt
[io@linuxbox~]$ ls -l /usr/bin > ls-output.txt
Qui, abbiamo creato un lungo elenco di / Usr / bin directory e ha inviato i risultati al file
ls-output.txt. Esaminiamo l'output reindirizzato del comando:
[io@linuxbox~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 167878 2016/02/01 15:07 ls-output.txt
[io@linuxbox~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 167878 2016/02/01 15:07 ls-output.txt
Buono; un bel file di testo di grandi dimensioni. Se guardiamo il file con meno, vedremo che il file
ls-output.txt contiene effettivamente i risultati del nostro comando ls:
[io@linuxbox~]$ meno ls-output.txt
[io@linuxbox~]$ meno ls-output.txt
Ora ripetiamo il nostro test di reindirizzamento, ma questa volta con una svolta. Cambieremo il nome della directory in uno che non esiste:
[io@linuxbox~]$ ls -l /bin/usr > ls-output.txt
ls: impossibile accedere a /bin/usr: nessun file o directory simile
[io@linuxbox~]$ ls -l /bin/usr > ls-output.txt
ls: impossibile accedere a /bin/usr: nessun file o directory simile
Abbiamo ricevuto un messaggio di errore. Questo ha senso poiché abbiamo specificato la directory inesistente /bin/usr, ma perché il messaggio di errore è stato visualizzato sullo schermo invece di essere reindirizzato al file? ls-output.txt? La risposta è che il ls il programma non invia i suoi messaggi di errore allo standard output. Invece, come la maggior parte dei programmi Unix ben scritti, invia i suoi messaggi di errore all'errore standard. Poiché abbiamo reindirizzato solo l'output standard e non l'errore standard, il messaggio di errore è stato comunque inviato allo schermo. Vedremo come
Reindirizzamento dell'output standard
per reindirizzare l'errore standard in appena un minuto, ma prima, diamo un'occhiata a cosa è successo al nostro file di output:
[io@linuxbox~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 0 2016/02/01 15:08 ls-output.txt
[io@linuxbox~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 0 2016/02/01 15:08 ls-output.txt
Il file ora ha lunghezza zero! Questo perché, quando reindirizziamo l'output con l'operatore di reindirizzamento “>”, il file di destinazione viene sempre riscritto dall'inizio. Dal nostro ls comando non ha generato risultati e solo un messaggio di errore, l'operazione di reindirizzamento è iniziata per riscrivere il file e poi si è interrotta a causa dell'errore, con conseguente suo troncamento. In effetti, se mai avessimo bisogno di troncare un file (o creare un nuovo file vuoto) possiamo usare un trucco come questo:
[io@linuxbox~]$ > ls-output.txt
[io@linuxbox~]$ > ls-output.txt
Utilizzando semplicemente l'operatore di reindirizzamento senza alcun comando che lo precede, verrà troncato un file esistente o verrà creato un nuovo file vuoto.
Quindi, come possiamo aggiungere l'output reindirizzato a un file invece di sovrascrivere il file dall'inizio? Per questo, usiamo l'operatore di reindirizzamento ">>", in questo modo:
[io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt
[io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt
L'utilizzo dell'operatore ">>" comporterà l'aggiunta dell'output al file. Se il file non esiste già, viene creato come se fosse stato utilizzato l'operatore “>”. Mettiamolo alla prova:
[io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt [io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt [io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt [io@linuxbox~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 503634 2016/02/01 15:45 ls-output.txt
[io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt [io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt [io@linuxbox~]$ ls -l /usr/bin >> ls-output.txt [io@linuxbox~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 503634 2016/02/01 15:45 ls-output.txt
Abbiamo ripetuto il comando tre volte risultando in un file di output tre volte più grande.