Nel post precedente abbiamo parlato in dettaglio dei parametri e delle opzioni. Oggi parleremo di qualcosa di essenziale nello scripting della shell, che sono Input, Output e Reindirizzamento.
Puoi visualizzare l'output degli script della shell in due modi:
- Visualizza output sullo schermo.
- Invia l'output a un file.
Descrittori di file standard
Tutto è un file in Linux e include input e output.
Ciascun processo può avere nove descrittori di file aperti contemporaneamente. I descrittori di file 0, 1, 2 vengono mantenuti per l'utilizzo della shell bash.
0 STDIN.
1 STDOUT.
2 STDERR.
Puoi utilizzare i descrittori di file sopra per controllare l'input e l'output.
Devi comprendere appieno questi tre perché sono come la spina dorsale del tuo scripting di shell. Quindi li descriveremo tutti in dettaglio.
STDIN
STDIN sta per standard input, che è la tastiera per impostazione predefinita.
Puoi sostituire STDIN, che è la tastiera e sostituirla con un file utilizzando il simbolo di reindirizzamento dell'input (<), invia i dati come digitazione da tastiera. Nessuna magia!!
Quando si digita il comando cat senza nulla, accetta l'input da STDIN. Qualsiasi riga digiti, il comando cat stampa quella riga sullo schermo.
STDOUT
STDOUT sta per l'uscita standard, che è lo schermo per impostazione predefinita.
Puoi reindirizzare l'output a un file usando il simbolo>>.
Se disponiamo di un file contenente dati, puoi aggiungervi dati utilizzando questo simbolo in questo modo:
pwd >> myfile
L'output generato da pwd viene aggiunto a myfile senza eliminare il contenuto esistente.
Il comando seguente tenta di reindirizzare l'output a un file utilizzando> simbolo.
ls –l xfile > myfile
Non ho alcun file chiamato xfile sul mio PC e questo genera un errore che viene inviato a STDERR.
STDERR
La shell invia gli errori allo schermo per impostazione predefinita.
Se devi reindirizzare gli errori a un file di registro invece di inviarlo allo schermo, puoi reindirizzare gli errori utilizzando il simbolo di reindirizzamento.
Errori di reindirizzamento
Possiamo reindirizzare gli errori posizionando il descrittore di file che è 2 prima del simbolo di reindirizzamento in questo modo:
ls -l xfile 2>myfile
cat ./myfile
Come puoi vedere, l'errore ora è nel file e nulla sullo schermo.
Errori di reindirizzamento e output normale
Per reindirizzare gli errori e l'output normale, devi precedere ciascuno con il descrittore di file appropriato come questo:
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
Il risultato del comando ls viene inviato al file di contenuto corretto utilizzando 1> simbolo. E i messaggi di errore sono stati inviati al file errorcontent utilizzando 2> simbolo.
Puoi reindirizzare l'output normale e gli errori allo stesso file utilizzando &> simbolo come questo:
ls –l myfile xfile anotherfile &> content
qui, reindirizziamo gli errori e l'output normale a un file denominato content.
Reindirizzamento output
Esistono due modi per il reindirizzamento dell'output:
- Reindirizzamento temporaneo.
- Reindirizzamento permanente.
Reindirizzamenti temporanei
Per reindirizzamenti temporanei, puoi utilizzare il simbolo>&2 in questo modo:
#!/bin/bash echo "Error message" >&2 echo "Normal message"
Quindi, se lo eseguiamo, vedremo entrambe le righe stampate normalmente perché, come sappiamo, gli errori vengono visualizzati per impostazione predefinita.
Puoi reindirizzare gli errori a un file come questo:
./myscript 2> myfile
Lo scripting della shell è fantastico! L'output normale viene inviato allo schermo, mentre il messaggio di eco che ha il simbolo>&2 invia errori al file.
Reindirizzamenti permanenti
Se hai molti dati che devono essere reindirizzati, puoi avere un reindirizzamento permanente usando il comando exec in questo modo:
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
Se osserviamo il file chiamato outfile, vedremo l'output delle linee di eco.
Reindirizziamo lo STDOUT all'inizio, che dire nel mezzo di uno script come questo:
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
Il comando exec reindirizza tutti gli errori al file myerror e inviamo l'output standard sullo schermo.
Usiamo l'istruzione exec 1>myfile per reindirizzare l'output al file myfile e, infine, gli errori vanno al file myerror utilizzando il simbolo>&2.
Reindirizzamento dell'input
Puoi reindirizzare l'input a un file invece di STDIN usando il comando exec come questo:
exec 0< myfile
Questo comando dice alla shell di prendere l'input da un file chiamato myfile invece di STDIN ed ecco un esempio:
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done
Lo scripting della shell è facile.
Sai come usare il comando read per ottenere l'input dell'utente. Se reindirizzi lo STDIN a un file, il comando di lettura proverà a leggere da STDIN, che punta al file.
Alcuni amministratori di sistema Linux utilizzano questa tecnica per leggere i file di registro per l'elaborazione e discuteremo altri modi per leggere il registro nei prossimi post in modo professionale.
Creazione di un reindirizzamento personalizzato
Sai che ci sono nove descrittori di file, ne usi solo 3 per input, output ed errore.
I restanti sei descrittori di file sono disponibili per l'uso per il reindirizzamento di input e output.
Possiamo usare il comando exec per assegnare un descrittore di file per l'output come questo:
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
Creazione di descrittori di file di input
Per reindirizzare i descrittori di file di input, procedi come segue:
1- Salva lo STDIN in un altro descrittore di file.
2- Reindirizzamento a un file.
3- Ripristina STDIN nella sua posizione originale.
Guarda il codice seguente per comprendere questi passaggi:
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
Abbiamo salvato lo STDIN nel descrittore di file 7 e reindirizzato lo STDIN a un file.
Lo STDIN è tornato alla sua posizione originale dopo l'iterazione sulle righe del file.
L'ultimo comando di lettura solo per assicurarsi che STDIN sia ripristinato e puoi usare la tastiera normalmente.
Chiudi i descrittori di file
Quando lo script si chiude, i descrittori di file si chiuderanno automaticamente. Se vuoi chiudere tu stesso il descrittore di file, reindirizza il descrittore di file a questo simbolo &- sarà chiuso.
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>&- echo "Nothing works" >&3
Come puoi vedere, dà un errore di descrittore di file errato perché non esiste più.
ldi comando
Il comando lsof viene utilizzato per elencare tutti i file aperti sul sistema e i processi in background.
Su molti sistemi Linux come Fedora, il comando lsof si trova in /usr/sbin.
Queste sono alcune delle opzioni importanti per il comando lsof:
-p:per l'ID processo.
-d:per il descrittore di file.
È possibile ottenere il PID di processo utilizzando la variabile $$.
Possiamo usare -a per combinare i risultati dell'opzione -p e dell'opzione -d.
Ora, testando il comando da uno script:
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
Lo script della shell crea i descrittori di file 4 e 5 per la scrittura e 6 per la lettura.
Soppressione dell'output del comando
A volte non vuoi vedere alcun output. Reindirizziamo l'output al buco nero che è /dev/null .
Ad esempio, possiamo eliminare errori come questo:
ls -al badfile anotherfile 2> /dev/null
Puoi troncare un file senza eliminarlo completamente usando lo stesso comando.
cat /dev/null > myfile
Ora capisci l'input, l'output, come reindirizzarli, come creare il tuo descrittore di file e reindirizzarlo ad esso.
Spero che vi piaccia. Continua a tornare.
Grazie.