cosa si intende per collegamento STDOUT e STDIN?


10

Sto leggendo un libro, dice:

Ogni processo ha almeno tre canali di comunicazione disponibili: "input standard" (STDIN), "output standard" (STDOUT) e "errore standard" (STDERR).

La maggior parte dei comandi accetta l'input da STDIN e scrive l'output su STDOUT. Scrivono messaggi di errore su STDERR. Questa convenzione consente di mettere insieme i comandi come blocchi predefiniti per creare condutture composite.

La shell interpreta i simboli <, >e >>come le istruzioni per reindirizzare input o output di un comando o da un file.

Per collegare lo STDOUT di un comando allo STDIN di un altro, utilizzare il | simbolo, comunemente noto come pipe.

ps -ef | grep httpd

Quindi, in sostanza, ciò che sta dicendo è che l'input standard è un comando che consente all'utente di scrivere su un file, mentre l'output standard è un comando che ha l'output di scrittura nella shell bash e l'errore standard è proprio come l'output ma è solo invocato quando si verifica un errore nel file system. Quindi arriviamo alla parte del collegamento di STDOUT e STDIN e mi sono perso.

Risposte:


25

L'input standard e l'output standard non sono comandi.

Immagina i comandi come macchine in una fabbrica con una catena di montaggio. La maggior parte delle macchine sono progettate per avere un nastro trasportatore per l'immissione dei dati e un nastro trasportatore per l'immissione dei dati; sono rispettivamente lo standard input e lo standard output. L'errore standard è un'apertura sul lato della macchina in cui è possibile espellere gli scarti.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

Lo schema sopra mostra un nastro trasportatore che attraversa due macchine. I dati provengono dal serbatoio di input a sinistra, vengono inviati alla macchina A, quindi l'output viene trasmesso ulteriormente alla macchina B (per la quale viene immesso) e l'output della macchina B viene depositato nel bucket di output sulla destra.

In termini unix, questo si chiama pipeline . La metafora è quella dell'impianto idraulico: un tubo collega la macchina A alla macchina B. La sintassi della shell per la tubazione sopra è

<input-file.txt commandA | commandB >output-file.txt

Il simbolo di < reindirizzamento indica alla shell di collegare commandAl'input standard al file input-file.txtprima del lancio commandA. (È possibile inserire il reindirizzamento prima o dopo il nome del comando.) Il >simbolo di reindirizzamento indica alla shell a cui collegare commandBl'output standard output-file.txt. Il |simbolo pipe (" ") nel mezzo indica alla shell di collegare commandAl'output commandBstandard all'ingresso standard prima di lanciarli.

I comandi possono avere più di un input e più di un output, ma questo è materiale per un altro giorno .


3
La
grafica ha

Bella analogia. Ho compreso il concetto della conduttura del flusso per molti anni ormai, ma in qualche modo nessuno ha mai usato l'analogia tra fabbrica e trasportatore, il che lo rende davvero facilmente (e sinteticamente) comprensibile. Grazie!
Owen Blacker,

1
Grande analogia. Prenderò in prestito questo se non ti dispiace.
Tivie,

Gilles, ho posto una domanda sulla tua frase in fondo: unix.stackexchange.com/q/96724/29146 . potresti chiarire?
strugee,

@Gilles - Puoi includere un esempio che illustra l'opzione per definire il reindirizzamento prima o dopo il comando? Ad esempio, la pipeline può leggere come input-file.txt> commandA o input-file.txt <commandA?
Motivato il

6

standard input is a command that allows user to write to a file

Non un comando, ma uno stream. Gli ingressi e le uscite standard sono come cassette postali. All'avvio di un programma, viene visualizzata una casella per ricevere e una casella per inviare posta. Di solito, l'input proviene dalla tastiera e viene inserito nella casella di posta, la posta inserita nella casella di posta finisce sullo schermo del terminale.

standard output is a command that has the bash shell write output to the shell

Il programma in realtà non sa dove punti standard out. Quando si inoltra A a B (come in $ A | B), quando A mette la posta nella casella di posta in uscita, questa finisce nella casella di posta in arrivo di B. B elabora l'input e inserisce la propria posta nella casella di posta, che è ciò che vedi sul terminale.

Per eliminare il metaforo, come detto, gli ingressi / uscite standard sono flussi. La casella di posta o il descrittore di file è un'estremità del flusso. Il pipe consiste nel collegare lo standard da A allo standard in B.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.