Quali Sono stdin, stdout e stderr su Linux?

0
920
Fatmawati Achmad Zaenuri/Shutterstock.com

stdin, stdout e stderr sono tre flussi di dati creato quando si lancia un comando di Linux. Si possono usare per capire se il tuo script sono in fase di sottofondo o reindirizzato. Vi mostriamo come.

Flussi Di Unire Due Punti

Non appena si inizia a conoscere Linux e sistemi operativi Unix-like, vi imbatterete in termini stdin, stdout e stederr. Questi sono i tre flussi standard, che vengono definiti in fase di Linux, il comando viene eseguito. In informatica, un flusso è qualcosa che può trasferire i dati. Nel caso di questi flussi, i dati di testo.

Flussi di dati, come i corsi d’acqua, hanno due estremità. Hanno un origine e una uscita. Qualunque sia il comando di Linux stai usando fornisce una estremità di ciascun flusso. L’altra estremità è determinato dalla shell che ha lanciato il comando. Che fine saranno collegati alla finestra di terminale, collegato a un tubo, o reindirizzato a un file o un altro comando, secondo la linea di comando che ha lanciato il comando.

La Linux Standard Flussi

In Linux, stdin è il flusso di input standard. Questo accetta di testo come input. Testo di output del comando, la shell è consegnato via stdout (standard) stream. Messaggi di errore dal comando vengono inviati attraverso il stderr (errore standard) stream.

Così si può vedere che ci sono due flussi di output, stdout e stderr, e uno stream di input, stdin. Poiché i messaggi di errore e di output normale avere il loro conduttore portare alla finestra di terminale, possono essere gestiti indipendentemente l’uno dall’altro.

I Flussi Vengono Gestiti Come File

Flussi in Linux—come quasi tutto il resto—sono trattati come se fossero dei file. È possibile leggere il testo da un file, e si può scrivere il testo in un file. Entrambe queste azioni comportano un flusso di dati. Quindi il concetto di gestione di un flusso di dati, come file, non è che molto di un tratto.

Ogni file è associato un processo è assegnato un numero univoco di identificazione. Questo è noto come il descrittore di file. Ogni volta che un’azione è necessaria per essere eseguita su un file, il descrittore di file è usato per identificare il file.

Questi valori sono da sempre utilizzati per stdin, stdout e stderr:

  • 0: stdin
  • 1: stdout
  • 2: stderr

Reagire a Tubi e Reindirizza

Per facilità di qualcuno introduzione ad un argomento, una tecnica comune è quello di insegnare una versione semplificata dell’argomento. Per esempio, con la grammatica, ci viene detto che la regola è “io prima E, tranne che dopo C.”, Ma in realtà, ci sono più eccezioni a questa regola che ci sono casi che obbedire.

In una vena simile, quando si parla di stdin, stdout e stderr è conveniente per tirar fuori accettato l’assioma che un processo non conosce né si preoccupa di dove i suoi tre flussi standard sono terminati. Se un processo di cura se la sua uscita è andare al terminal o di essere reindirizzati su un file? Si può anche dire se l’input viene da tastiera o viene convogliato in un altro processo?

In realtà, un processo che non sappiamo, o almeno si può scoprire, dovrebbe scegliere di effettuare il check—ed è possibile modificare il proprio comportamento di conseguenza se il software autore ha deciso di aggiungere questa funzionalità.

Siamo in grado di vedere questo cambiamento nel comportamento molto facilmente. Prova questi due comandi:

ls

ls | gatto

Il comando ls si comporta in modo diverso se il suo output (stdout) viene convogliato in un altro comando. È ls che passa in una singola colonna di output, non è una conversione eseguita da un gatto. E ls fa la stessa cosa se la sua uscita è reindirizzata:

ls > capture.txt

gatto capture.txt

Reindirizzamento stdout e stderr.

C’è un vantaggio ad avere messaggi di errore consegnato da un apposito flusso. Significa che siamo in grado di reindirizzare l’output di un comando di output (stdout) di un file e vedere eventuali messaggi di errore (stderr) nella finestra del terminale. Si può reagire agli errori, se è necessario, come si verificano. Si ferma anche i messaggi di errore di contaminare il file stdout è stata deviata verso.

Digitare il seguente testo in un editor e salvare in un file chiamato error.sh.

#!/bin/bash

echo “per tentare di accedere a un file che non esiste”
gatto bad-filename.txt

Rendere eseguibile lo script con questo comando:

chmod +x error.sh

La prima riga dello script, echi di testo nella finestra di terminale, tramite il flusso stdout. La seconda linea tenta di accedere a un file che non esiste. Questo genererà un messaggio di errore che viene consegnato tramite stderr.

Eseguire lo script con questo comando:

./error.sh

Si può vedere che entrambi i flussi di uscita, stdout e stderr, che sono stati visualizzati nella finestra di terminale.

Cerchiamo di reindirizzare l’output in un file:

./error.sh > capture.txt

Il messaggio di errore che viene consegnato tramite stderr è ancora inviati alla finestra di terminale. Siamo in grado di controllare il contenuto del file per vedere se il stdout uscita è andato per il file.

gatto capture.txt

L’uscita da stdin è stato reindirizzato al file come previsto.

Il > simbolo di reindirizzamento funziona con stdout per impostazione predefinita. È possibile utilizzare uno dei numeri descrittori di file per indicare che flusso di output standard che si desidera reindirizzare.

Per reindirizzare in modo esplicito stdout, utilizzare questo reindirizzamento di istruzioni:

1>

Per reindirizzare in modo esplicito stderr, utilizzare questo reindirizzamento di istruzioni:

2>

Cerchiamo per il nostro test di nuovo, e questa volta usiamo 2>:

./error.sh 2> capture.txt

Il messaggio di errore viene reindirizzato e stdout echo messaggio viene inviato alla finestra di terminale:

Andiamo a vedere cosa c’è nella capture.txt file.

gatto capture.txt

Il stderr messaggio è in capture.txt come previsto.

Reindirizzamento Sia stdout e stderr.

Sicuramente, se siamo in grado di reindirizzare o stderr e stdout o in un file in modo indipendente l’uno dall’altro, dobbiamo essere in grado di reindirizzare tutti e due allo stesso tempo, in due file diversi?

Sì, possiamo. Questo comando diretto stdout di un file chiamato capture.txt e stderr in un file chiamato error.txt.

./error.sh 1> capture.txt 2> error.txt

Perché entrambi i flussi di output–standard output e standard error—reindirizzato a file, non c’è output visibile nella finestra del terminale. Siamo tornati al prompt della riga di comando, come se nulla si è verificato.

Andiamo a controllare il contenuto di ogni file:

gatto capture.txt
gatto error.txt

Reindirizzamento stdout e stderr allo Stesso File

Che è pulito, abbiamo ogni uscita standard flussi di andare ai propri file dedicato. L’unica altra combinazione che si può fare è inviare stdout e stderr per lo stesso file.

Siamo in grado di raggiungere questo obiettivo con il seguente comando:

./error.sh > capture.txt 2&>1

Let’s break che verso il basso.

  • ./error.sh: Lancia error.sh file di script.
  • > capture.txt: Reindirizza il flusso stdout per il capture.txt file. > è una scorciatoia per 1>.
  • 2>&1: Questo utilizza i &> redirect istruzione. Questa istruzione consente di raccontare la shell per fare uno stream ottenuto per la stessa destinazione di un altro flusso. In questo caso, stiamo dicendo “reindirizzare il flusso 2, stderr, per la stessa destinazione stream 1, stdout, viene reindirizzati.”

Non c’è nessun output visibile. Che incoraggiante.

Vediamo i capture.txt file e vedere che cosa è in esso.

gatto capture.txt

Sia stdout e stderr flussi sono stati reindirizzati a un singolo file di destinazione.

Per avere l’uscita di un flusso reindirizzato in silenzio e gettato via, di indirizzare l’output di /dev/null.

Rilevare il Reindirizzamento all’Interno di uno Script

Abbiamo discusso di come un comando in grado di rilevare se uno qualsiasi dei flussi per essere reindirizzato, e può scegliere di modificare il suo comportamento di conseguenza. Possiamo farlo con i nostri script? Sì, possiamo. Ed è una tecnica semplice da capire e utilizzare.

Digitare il seguente testo in un editor e salvarlo come input.sh.

#!/bin/bash

if [ -t 0 ]; then

eco stdin provenienti dalla tastiera

altro

eco stdin proveniente da un tubo o un file

fi

Utilizzare il seguente comando per renderlo eseguibile:

chmod +x input.sh

La parte intelligente è la prova che all’interno delle parentesi quadre. L’-t (terminale) opzione restituisce true (0) se il file associato al descrittore di file termina nella finestra del terminale. Abbiamo utilizzato il file descriptor 0 come argomento di prova, che rappresenta stdin.

Se stdin è collegato a una finestra di terminale il test si rivelerà vera. Se stdin è collegato a un file o a un tubo, il test avrà esito negativo.

Siamo in grado di utilizzare qualsiasi file di testo per generare input allo script. Qui stiamo usando uno chiamato dummy.txt.

./input.sh < dummy.txt

L’output mostra che lo script riconosce che l’ingresso non è venuta da una tastiera, è venuta da un file. Se si sceglie, è possibile variare il tuo script comportamento di conseguenza.

Che è stato con un file di reindirizzamento, proviamo con un tubo.

gatto dummy.txt | ./input.sh

Lo script riconosce che il suo ingresso è in fase di sottofondo in esso. O, più precisamente, si riconosce ancora una volta che il stdin stream non è collegato a una finestra di terminale.

Eseguire lo script con nessuno dei due tubi, né i redirect.

./input.sh

Il stream stdin è collegato al terminale, e lo script segnala questo di conseguenza.

Per verificare la stessa cosa con il flusso di uscita, abbiamo bisogno di un nuovo script. Digitare quanto segue in un editor e salvarlo come output.sh.

#!/bin/bash

if [ -t 1 ]; then

eco stdout sta andando alla finestra di terminale

altro

eco stdout viene reindirizzato o filodiffusione

fi

Utilizzare il seguente comando per renderlo eseguibile:

chmod +x input.sh

L’unico cambiamento significativo a questo script nel test in parentesi quadre. Stiamo usando la cifra 1 per rappresentare il descrittore del file di output.

Let’s try it out. Noi provvederemo a inviare l’output tramite cat.

./uscita | gatto

Lo script riconosce che la sua uscita non è di andare direttamente in una finestra di terminale.

Possiamo anche testare lo script reindirizzando l’output in un file.

./output.sh > capture.txt

Non c’è uscita la finestra di terminale, siamo in silenzio tornare al prompt dei comandi. Come ci saremmo aspettati.

Si può guardare all’interno della capture.txt file per vedere cosa è stato catturato. Utilizzare il seguente comando per farlo.

gatto capture.sh

Di nuovo, il semplice test nel nostro script rileva che il flusso stdout non viene inviato direttamente in una finestra di terminale.

Se si esegue lo script senza tubi o reindirizzamenti, si deve rilevare che stdout viene consegnato direttamente alla finestra di terminale.

./output.sh

E questo è esattamente ciò che vediamo.

Flussi Di Coscienza

Sapendo come sapere se il tuo script sono collegati alla finestra di terminale, o un tubo, o di essere reindirizzato, consente di regolare il loro comportamento di conseguenza.

La registrazione e la diagnostica può essere più o meno dettagliata, a seconda se si sta andando per lo schermo o un file. Messaggi di errore possono essere registrate in un file diverso da quello normale di uscita del programma.

Come è solitamente il caso, più la conoscenza porta più opzioni.

CONTINUA A LEGGERE

  • “Come richiedere la Carta di Apple
  • “Che App Nativa È Probabilmente Solo un Vecchio Browser Web
  • “Come Aprire Vecchie Pagine Web in Internet Explorer su Windows 10
  • “Che cosa Significa “Yeet” Dire, e Come Si Utilizza?
  • “Come Creare Collegamenti sul Desktop di Windows 10 in Modo Facile