GNU/Linux >> Linux Esercitazione >  >> Linux

Shell Scripting Part4 – Input, Output e Reindirizzamento

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.


Linux
  1. Leggi e scrivi dati da qualsiasi luogo con reindirizzamento nel terminale Linux

  2. Lavorare con l'output di input e il reindirizzamento degli errori in Linux

  3. Reindirizzamento e uscita del tubo?

  4. L'output del comando reindirizza al file e al terminale

  5. Linux:come utilizzare un file come input e output allo stesso tempo?

Come reindirizzare l'output del comando della shell

Spiegazione del reindirizzamento di input e output su Linux

Come ottenere l'input e l'output in un terminale in un file di testo?

Spiegazione:input, output e reindirizzamento degli errori in Linux

Pipe e reindirizzamento in Linux - Spiegazione!

Bash Scripting:come generare e formattare il testo su Linux Shell