GNU/Linux >> Linux Esercitazione >  >> Linux

Reindirizzamento Bash spiegato con esempi

Reindirizzamento e piping sono due funzioni utili nello scripting bash che amministratori di sistema e sviluppatori utilizzano spesso. In questa guida, discuteremo di cosa sia il Reindirizzamento Bash e come lavorare con il reindirizzamento in Bash con comandi di esempio.

Prima di capire come funziona il reindirizzamento, è importante sapere cos'è il descrittore di file.

Cos'è un descrittore di file?

Quando apri un file in Linux, a ciascun file verrà assegnato un numero intero e queste informazioni vengono archiviate nel kernel. In questo modo il kernel sa quali file sono aperti e quale processo ha aperto i file. Il numero intero assegnato è quello che chiamiamo descrittore di file (in breve FD).

Per impostazione predefinita, ogni programma inizierà con tre descrittori di file.

  • FD 0 -> Ingresso standard(stdin) -> Tastiera
  • FD 1 -> Uscita standard (Stdout) -> Display (Terminale)
  • FD 2 -> Errore standard(Stderr) -> Display(Terminale)

Puoi vedere i descrittori di file in /dev directory:

$ ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Aug 27 21:32 /dev/stdout -> /proc/self/fd/1

Stdin (FD0) riceve input dalla tastiera. stdout (FD1) e stderr (FD2) vengono inviati al terminale. Quando utilizzi Pipe e reindirizzamenti, puoi cambiare il modo in cui l'input viene passato e l'output e gli errori vengono inviati.

Reindirizzamento dell'output a un file

Come affermato in precedenza, l'output (stdout) e l'errore (stderr) di qualsiasi programma vengono inviati al terminale. Puoi utilizzare l'operatore di reindirizzamento ">" per scrivere lo stdout e lo stderr in un file.

Dai un'occhiata all'esempio qui sotto. Sto eseguendo uname -mrs comando e reindirizzando l'output a un file chiamato uname.log .

$ uname -mrs > uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64

Avviso: Quando si utilizza ">" operatore, se il file non è disponibile, verrà creato. E se il file esiste già, verrà sovrascritto con nuovi contenuti.

Puoi anche utilizzare il numero del descrittore di file per stdout(1) prima dell'operatore di reindirizzamento per reindirizzare l'output a un file.

$ uname -mrs 1> uname.log

Come ho già detto, un unico operatore di reindirizzamento (> ) sovrascriverà il contenuto di un file solo se il file esiste già. Tuttavia, se desideri aggiungere il contenuto invece di sovrascrivere lo stesso file, utilizza l'operatore di reindirizzamento doppio (ad esempio >> ). Puoi anche usare qui il descrittore di file stdout(1).

$ whoami >> uname.log
$ echo $SHELL 1>> uname.log
$ cat uname.log
Linux 5.10.0-8-amd64 x86_64
ostechnix
/bin/bash

Come gestire Stderr

Ogni programma genera sia output che errore ed entrambi vengono inviati al terminale. In molti casi, potresti voler ignorare l'errore o isolare gli errori e reindirizzarlo a un file separato per la risoluzione dei problemi.

Facciamo un semplice esempio di esecuzione di ls comando per vedere come funziona. Sto cercando di elencare due file di cui solo uno è presente. Ricevo sia il mio errore che l'output nel terminale come ho già detto.

$ ls -l uname.log u1.log
ls: cannot access 'u1.log': No such file or directory
-rw-r--r-- 1 ostechnix ostechnix 48 Aug 27 07:37 uname.log

Sto eseguendo lo stesso ls comando di nuovo ma questa volta reindirizzando l'output a un file. Come puoi vedere dall'output > operator reindirizza stdout(1) a un file ma stderr(2) viene inviato al terminale.

$ ls -l uname.log u1.log > ls.op
ls: cannot access 'u1.log': No such file or directory

Per reindirizzare stderr a un file, usa il "2>" operatore. È obbligatorio utilizzare il descrittore di file per stderr(2) prima dell'operatore di reindirizzamento> che invierà l'errore da solo a un file.

$ ls -l uname.log u1.log > ls.op 2> ls.err
$ cat ls.err
ls: cannot access 'u1.log': No such file or directory

Ora, stdout e stderr vengono scritti in file separati. Puoi anche inviare stdout e stderr anche a un singolo file.

$ ls -l uname.log u1.log 1> ls.op 2> ls.op

Da bash 4.4 , puoi anche utilizzare &> sign per reindirizzare sia stdout che stderr a un file.

$ ls -l uname.log u1.log &> ls.op

Cos'è /dev/null?

Null è un file di caratteri speciali che accetta l'input e scarta l'input e non produce alcun output. Per dirla semplicemente, null scarta qualsiasi cosa tu reindirizzi ad esso.

$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Aug 27 06:01 /dev/null

Perché il null importa nel reindirizzamento? Potresti chiederti. In alcuni casi, potresti non voler stampare o memorizzare stdout o stderr. In tal caso, puoi reindirizzare stdout o stderr a /dev/null che eliminerà il flusso di input.

$ date > /dev/null
$ date 1> /dev/null    # Stdout to Null
$ dateee 2> /dev/null  # WRONG COMMAND, Stderr to Null
$ date &> /dev/null    # Stdout/Stderr to Null

Input Reindirizzamento in Bash

Simile a come stai reindirizzando l'output e l'errore a un file, puoi anche passare gli input a un comando utilizzando l'operatore di reindirizzamento dell'input (< ).

Iniziamo con un semplice programma di conteggio delle parole. Qui sto reindirizzando il contenuto di ostechnix.txt file nel conteggio delle parole per trovare il numero di righe.

$ wc -l < ostechnix.txt 
10

Puoi anche passare il descrittore di file stdin (0) durante il reindirizzamento dell'input.

$ wc -l 0< ostechnix.txt 
10

Puoi combinare gli operatori di reindirizzamento di input e output come mostrato di seguito.

$ wc -l < ostechnix.txt &> /tmp/wc.op
$ cat /tmp/wc.op 
10

Il reindirizzamento dell'input verrà utilizzato insieme a un ciclo while per leggere il contenuto di un file riga per riga.

Dai un'occhiata all'esempio qui sotto. Sto passando il /etc/passwd file come input per il while comando. Qui il read il comando leggerà riga per riga e lo memorizzerà nella variabile VAL e più in basso nella condizione del ciclo viene scritta per verificare se l'utente è disponibile.

while read VAL; do   
  NAME=$(echo $VAL | awk -F  ":" '/1/ {print $1}' )
  if [[ $NAME = "karthick" ]]
  then
   echo "User spotted"
  fi
done < /etc/passwd

Uno script per trovare l'utente di sistema

Sostituisci "karthick" nel codice sopra con il tuo nome utente di sistema. Salva il file e chiudilo.

Questo non è un modo ottimale per raggiungere l'obiettivo di trovare l'utente, ma a scopo dimostrativo, questo andrà bene.

Ora, rendi eseguibile lo script ed eseguilo:

$ chmod +x ostechnix.sh 
$ ./ostechnix.sh 
User spotted

Bash supporta un'altra forma di reindirizzamento dell'input nota come Heredoc . Per maggiori dettagli, fare riferimento alla seguente guida:

  • Tutorial Bash Heredoc per principianti

Riepilogo

In questa guida, abbiamo appreso alcuni importanti concetti di scripting come cos'è il reindirizzamento Bash, cos'è il descrittore di file, come reindirizzare un output in un file, come gestire stderr, cos'è /dev/null e come viene utilizzato in Bash reindirizzamento e infine abbiamo concluso la guida con Reindirizzamento input in Bash.

Se desideri imparare lo scripting Bash, dovresti imparare e familiarizzare con i concetti spiegati qui. Per metterti comodo, ti consiglio di provare tutti i comandi che abbiamo mostrato in questo articolo nel tuo sistema.

Se hai commenti o suggerimenti che aiuteranno la comunità Linux e i nostri lettori a imparare lo scripting bash, non esitare a farcelo sapere nella sezione commenti qui sotto.

Lettura consigliata:

  • Scripting Bash:variabili spiegate con esempi
  • Scripting Bash:funzioni spiegate con esempi
  • Scripting di Bash:il ciclo For viene spiegato con esempi
  • Scripting Bash:spiegazione del ciclo While e Until con esempi
  • Comando Bash Echo spiegato con esempi in Linux
  • L'elenco delle utili scorciatoie da tastiera di Bash
  • Differenza tra la definizione di variabili Bash con e senza esportazione

Linux
  1. Come scrivere uno script Bash con esempi

  2. Bash HereDoc Tutorial con esempi

  3. Comando Linux cksum spiegato per principianti (con esempi)

  4. Bash Istruzione If-Else con esempi

  5. Come creare e montare il file system Btrfs (spiegato con esempi)

Scripting Bash – Spiegazione del comando Printf con esempi

Bash Scripting – Array associativo spiegato con esempi

Bash Scripting – Array indicizzato spiegato con esempi

Il comando Tr in Linux spiegato con esempi

Permessi e proprietà dei file Linux spiegati con esempi

Script Bash per Loop spiegato con esempi