Cosa sono stdin, stderr e stdout in Bash

What Are Stdin Stderr



Ogni volta che si esegue un comando nel terminale, standard , stderr , e stdout sono tre flussi di dati creati da bash. Se hai familiarità con la riga di comando, potresti aver già sfruttato queste funzionalità. Essenzialmente, consentono il reindirizzamento/reindirizzamento dei dati da un comando a un altro.

Scopriamo come standard , stderr , e stdout funziona e come puoi usarli anche tu.







stdin, stdout e stderr

In informatica, il termine flusso si riferisce a qualcosa che può trasferire dati. Qui, tutti e tre i flussi portano il testo come dati.



Analogamente ai flussi d'acqua, anche i flussi di dati hanno due endpoint. Ci sono una fonte e un deflusso. Qualunque sia il comando che stai eseguendo nel terminale sarà in entrambi i punti del flusso. Usando il flusso, puoi connettere due finestre di terminale, due comandi diversi e persino file!



Diamo una rapida ripartizione dei flussi speciali.





  • stdin: sta per input standard. Prende il testo come input.
  • stdout: sta per output standard. L'output di testo di un comando è memorizzato nel flusso stdout.
  • stderr: sta per errore standard. Ogni volta che un comando incontra un errore, il messaggio di errore viene archiviato in questo flusso.

In Linux, quasi tutti i flussi vengono trattati come se fossero file. Proprio come puoi leggere/scrivere un file, puoi leggere/scrivere dati da questi flussi.

Un modo semplice per accedere a qualsiasi file consiste nell'utilizzare il numero del descrittore di file univoco ad esso associato. Nel caso di questi flussi, a ciascuno di essi sono assegnati valori univoci.



  • 0: standard
  • 1: stdout
  • 2: stderr

stdin, stdout e stderr in azione

Iniziamo imparando di più su questi flussi attraverso l'azione, inizieremo con stdin.

Esegui il seguente comando.

$leggere

Il comando richiederà l'input dalla tastiera. Qui, lo strumento di lettura riceve l'input da stdin. Ora diamo un'occhiata a stdout.

Esegui prima il comando.

$ls -l

Qui, il comando ls elenca i file nella directory corrente. L'elenco viene inviato a stdout e il terminale lo stampa. Controlliamo lo stderr ora.

Esistono diversi modi in cui può verificarsi un errore. Per questo esempio, l'invio di ls come argomento non valido risulterà in un errore.

$ls -lnulla

Qui, non c'è nessun file chiamato nulla. Ecco perché il messaggio ls return viene inviato a stderr .

Tubazioni

Questa è una tecnica comune che sfrutta appieno i flussi stdin e stdout. Spieghiamolo con un esempio.

$buttato fuori 'Ciao mondo' | presaCiao

Qui, il | segno è responsabile per le tubazioni. Il risultato buttato fuori genera è scritto in stdout flusso. Quindi, il piping reindirizza il contenuto di stdout a stdin per il comando grep. È così che grep sa su quale contenuto eseguire l'operazione.

Se vuoi reindirizzare sia lo stderr che lo stdout al comando successivo, usa invece |&.

$buttato fuoriCiao mondo| & gatto

$nulla| & gatto

Reindirizzamento dei flussi

Ora sappiamo come funzionano questi flussi, diamo un'occhiata a come puoi reindirizzarli. Le tubazioni sono una forma di reindirizzamento. Tuttavia, coinvolge solo stdin e stdout. Bash consente un controllo specifico su tutti e tre i flussi.

Per reindirizzare il contenuto stdout su un file, aggiungi l'angolo > seguito dal nome del file di destinazione.

$buttato fuoriCiao mondo>ciao.txt

Qui, l'output del comando echo verrà archiviato nel file hello.txt.

Se il file esiste già, il comando sopra lo sovrascriverà. Per evitarlo, assicurati che il nome del file sia univoco. Se non vuoi sovrascrivere, potresti usare >> invece. Aggiunge l'output alla fine del file di destinazione.

$buttato fuori 'Ciao mondo' >>ciao.txt

L'obiettivo di stdin è lavorare con l'input. Questo può anche essere reindirizzato. Ad esempio, invece di digitare l'input dalla tastiera, può essere caricato da un file.

In questo comando, cat prenderà il suo input direttamente dal file hello.txt.

$gatto <ciao.txt

Diamo un'occhiata al reindirizzamento con un esempio diverso. Questa volta, coinvolgerà uno script Python.

$#pyin.py
$ nome= ingresso('Inserisci il nome ')
$e-mail = ingresso('Inserisci l'email ')
$Stampa('Il tuo nome è %se l'email è %s'%(nome, e-mail))

L'input per lo script si trova in hello.txt.

$gattociao.txt

Inviamo il file come input per lo script.

$ python3 pyin.pi <Ciao.testo

È interessante notare che puoi reindirizzare entrambi standard e stdout nella stessa riga di comando. Qui, il seguente comando utilizzerà hello.txt come standard e invia il stdout del comando in un file.

$ python3 pyin.pi <Ciao.testo >produzione.testo

Il reindirizzamento di stderr è simile a stdout. Tuttavia, è necessario menzionare l'ID descrizione 2 per indicare stderr. Altrimenti, userà solo stdout.

Qui, reindirizzerò il contenuto del stderr in un file di testo.

$nulla2>errore.txt

Reindirizzamento Stdout e Stderr

Sì, è possibile reindirizzarli entrambi contemporaneamente. Tutto ciò che serve è menzionare l'ID descrizione 1 e 2 prima del reindirizzamento.

$buttato fuoriCiao mondo1>output.log2>debug.log

Pensieri finali

standard , stdout , e stderr sono caratteristiche meravigliose offerte da bash per impostazione predefinita. Se ti piacciono gli script bash, usarli può essere incredibilmente utile in situazioni difficili.

Vuoi saperne di più sullo scripting bash? Cominciamo con questo guida per principianti allo scripting bash !

Divertiti!