I dati vengono inseriti nel computer tramite stdin (di solito la tastiera) e l'output risultante va a stdout (di solito il guscio). Questi percorsi sono chiamati stream . Tuttavia, è possibile modificare queste posizioni di input e output, facendo in modo che il computer ottenga informazioni da un luogo diverso da stdin o invia i risultati in un luogo diverso da stdout . Questa funzionalità è denominata reindirizzamento .
In questo articolo imparerai cinque operatori di reindirizzamento, incluso uno per stderr . Ho fornito esempi di ciascuno e presentato il materiale in un modo che puoi duplicare sul tuo sistema Linux.
Uscita regolare> operatore
Il redirector di output è probabilmente il più riconosciuto degli operatori. L'output standard (stdout ) è solitamente nella finestra del terminale. Ad esempio, quando digiti la date
comando, sullo schermo viene visualizzato l'output di ora e data risultante.
[damon@localhost ~]$ date
Tue Dec 29 04:07:37 PM MST 2020
[damon@localhost ~]$
È tuttavia possibile reindirizzare questo output da stdout da qualche altra parte. In questo caso, reindirizzerò i risultati a un file chiamato specifications.txt
. Confermerò che ha funzionato usando il cat
comando per visualizzare il contenuto del file.
[damon@localhost ~]$ date > specifications.txt
[damon@localhost ~]$ cat specifications.txt
Tue Dec 29 04:08:44 PM MST 2020
[damon@localhost ~]$
Il problema con il >
redirector è che sovrascrive tutti i dati esistenti nel file. A questo punto, ora hai date
informazioni in specifications.txt
file, giusto? Se digiti hostname > specifications.txt
, l'output verrà inviato al file di testo, ma sovrascriverà le informazioni su ora e data esistenti dai passaggi precedenti.
[damon@localhost ~]$ hostname > specifications.txt
[damon@localhost ~]$ cat specifications.txt
localhost.localdomain
[damon@localhost ~]$
È facile avere problemi con il >
redirector sovrascrivendo accidentalmente le informazioni esistenti.
[ I lettori hanno apprezzato anche: 10 comandi Linux di base che devi conoscere ]
Uscita regolare append>> operatore
L'aggiunta >>
l'operatore aggiunge l'output al contenuto esistente invece di sovrascriverlo. Ciò consente di reindirizzare l'output da più comandi a un singolo file. Ad esempio, potrei reindirizzare l'output di date
utilizzando il >
operatore e quindi reindirizzare hostname
e uname -r
alle specifications.txt
file utilizzando >>
operatore.
[damon@localhost ~]$ date > specifications.txt
[damon@localhost ~]$ hostname >> specifications.txt
[damon@localhost ~]$ uname -r >> specifications.txt
[damon@localhost ~]$ cat specifications.txt
Tue Dec 29 04:11:51 PM MST 2020
localhost.localdomain
5.9.16-200.fc33.x86_64
[damon@localhost ~]$
Nota :Il >>
redirector funziona anche su un file vuoto. Ciò significa che potresti plausibilmente
ignora il normale >
redirector per ridurre la possibilità di sovrascrivere i dati e fare sempre affidamento su >>
reindirizzatore invece. Non è una cattiva abitudine prendere.
Inserimento regolare
Il redirector di input estrae i dati in un flusso da una determinata origine. Di solito, i programmi ricevono il loro input dalla tastiera. Tuttavia, i dati possono essere estratti da un'altra fonte, come un file.
È ora di creare un esempio utilizzando sort
comando. Innanzitutto, crea un file di testo chiamato mylist.txt
che contiene le seguenti righe:
cat
dog
horse
cow
Osserva che gli animali non elencati in ordine alfabetico.
E se dovessi elencarli in ordine? Puoi inserire il contenuto del file in sort
comando utilizzando il <
operatore.
[damon@localhost ~]$ sort < mylist.txt
cat
cow
dog
horse
[damon@localhost ~]$
Potresti anche diventare un po' più elaborato e reindirizzare i risultati ordinati a un nuovo file:
[damon@localhost ~]$ sort < mylist.txt > alphabetical-file.txt
[damon@localhost ~]$ cat alphabetical-file.txt
cat
cow
dog
horse
[damon@localhost ~]$
Operatore errore 2> normale
Lo stdout visualizza i risultati attesi. Se vengono visualizzati errori, vengono gestiti in modo diverso. Gli errori sono etichettati come descrittore di file 2 (l'output standard è descrittore di file 1). Quando un programma o uno script non genera i risultati previsti, genera un errore. L'errore viene solitamente inviato allo stdout , ma può essere reindirizzato altrove. Lo stderr l'operatore è 2>
(per descrittore di file 2).
Ecco un semplice esempio, usando il ping
con errori di ortografia comando:
[damon@localhost ~]$ png
bash: png: command not found...
[damon@localhost ~]$
Ecco lo stesso comando errato con l'output di errore reindirizzato a /dev/null
:
[damon@localhost ~]$ png 2> /dev/null
[damon@localhost ~]$
Il messaggio di errore risultante viene reindirizzato a /dev/null
invece di stdout , quindi nessun risultato o messaggio di errore viene visualizzato sullo schermo.
Nota :/dev/null
o il secchio di bit , viene utilizzato come cestino della spazzatura per la riga di comando. L'output indesiderato può essere reindirizzato a questa posizione per farlo semplicemente scomparire. Ad esempio, forse stai scrivendo uno script e vuoi testarne alcune funzionalità, ma sai che genererà errori che non ti interessano in questa fase di sviluppo. Puoi eseguire lo script e dirgli di reindirizzare gli errori a /dev/null
per comodità.
Tubo | operatore
Ken Hess ha già un solido articolo sull'uso della pipe |
operatore, quindi mostrerò solo una dimostrazione molto veloce qui.
La pipe prende l'output del primo comando e lo rende l'input del secondo comando. Potresti voler vedere un elenco di tutte le directory e file in /etc
directory. Sai che sarà un lungo elenco e che la maggior parte dell'output scorrerà fuori dalla parte superiore dello schermo. Il less
il comando suddividerà l'output in pagine e potrai quindi scorrere le pagine verso l'alto o verso il basso per visualizzare i risultati. La sintassi è di emettere ls
comando per elencare il contenuto di /etc
, quindi usa pipe per inviare quell'elenco in less
in modo che possa essere suddiviso in pagine.
[damon@localhost ~]$ ls /etc | less
L'articolo di Ken ha molti altri ottimi esempi. Personalmente, mi ritrovo a usare command | less
e command | grep string
il più spesso.
[ Scarica ora:una guida per l'amministratore di sistema allo scripting Bash. ]
Concludi
Gli operatori di reindirizzamento sono molto utili e spero che questo breve riepilogo ti abbia fornito alcuni trucchi per manipolare input e output. La chiave è ricordare che il >
l'operatore sovrascriverà i dati esistenti.
Il redirector di input estrae i dati in un flusso da una determinata origine. Di solito, i programmi ricevono il loro input dalla tastiera. Tuttavia, i dati possono essere estratti da un'altra fonte, come un file.
È ora di creare un esempio utilizzando sort
comando. Innanzitutto, crea un file di testo chiamato mylist.txt
che contiene le seguenti righe:
cat
dog
horse
cow
Osserva che gli animali non elencati in ordine alfabetico.
E se dovessi elencarli in ordine? Puoi inserire il contenuto del file in sort
comando utilizzando il <
operatore.
[damon@localhost ~]$ sort < mylist.txt
cat
cow
dog
horse
[damon@localhost ~]$
Potresti anche diventare un po' più elaborato e reindirizzare i risultati ordinati a un nuovo file:
[damon@localhost ~]$ sort < mylist.txt > alphabetical-file.txt
[damon@localhost ~]$ cat alphabetical-file.txt
cat
cow
dog
horse
[damon@localhost ~]$
Operatore errore 2> normale
Lo stdout visualizza i risultati attesi. Se vengono visualizzati errori, vengono gestiti in modo diverso. Gli errori sono etichettati come descrittore di file 2 (l'output standard è descrittore di file 1). Quando un programma o uno script non genera i risultati previsti, genera un errore. L'errore viene solitamente inviato allo stdout , ma può essere reindirizzato altrove. Lo stderr l'operatore è 2>
(per descrittore di file 2).
Ecco un semplice esempio, usando il ping
con errori di ortografia comando:
[damon@localhost ~]$ png
bash: png: command not found...
[damon@localhost ~]$
Ecco lo stesso comando errato con l'output di errore reindirizzato a /dev/null
:
[damon@localhost ~]$ png 2> /dev/null
[damon@localhost ~]$
Il messaggio di errore risultante viene reindirizzato a /dev/null
invece di stdout , quindi nessun risultato o messaggio di errore viene visualizzato sullo schermo.
Nota :/dev/null
o il secchio di bit , viene utilizzato come cestino della spazzatura per la riga di comando. L'output indesiderato può essere reindirizzato a questa posizione per farlo semplicemente scomparire. Ad esempio, forse stai scrivendo uno script e vuoi testarne alcune funzionalità, ma sai che genererà errori che non ti interessano in questa fase di sviluppo. Puoi eseguire lo script e dirgli di reindirizzare gli errori a /dev/null
per comodità.
Tubo | operatore
Ken Hess ha già un solido articolo sull'uso della pipe |
operatore, quindi mostrerò solo una dimostrazione molto veloce qui.
La pipe prende l'output del primo comando e lo rende l'input del secondo comando. Potresti voler vedere un elenco di tutte le directory e file in /etc
directory. Sai che sarà un lungo elenco e che la maggior parte dell'output scorrerà fuori dalla parte superiore dello schermo. Il less
il comando suddividerà l'output in pagine e potrai quindi scorrere le pagine verso l'alto o verso il basso per visualizzare i risultati. La sintassi è di emettere ls
comando per elencare il contenuto di /etc
, quindi usa pipe per inviare quell'elenco in less
in modo che possa essere suddiviso in pagine.
[damon@localhost ~]$ ls /etc | less
L'articolo di Ken ha molti altri ottimi esempi. Personalmente, mi ritrovo a usare command | less
e command | grep string
il più spesso.
[ Scarica ora:una guida per l'amministratore di sistema allo scripting Bash. ]
Concludi
Gli operatori di reindirizzamento sono molto utili e spero che questo breve riepilogo ti abbia fornito alcuni trucchi per manipolare input e output. La chiave è ricordare che il >
l'operatore sovrascriverà i dati esistenti.