¿Qué se entiende por conectar STDOUT y STDIN?

10

Estoy leyendo un libro, dice:

Cada proceso tiene al menos tres canales de comunicación disponibles: "entrada estándar" (STDIN), "salida estándar" (STDOUT) y "error estándar" (STDERR).

La mayoría de los comandos aceptan su entrada de STDIN y escriben su salida en STDOUT. Escriben mensajes de error a STDERR. Esta convención le permite encadenar comandos como bloques de construcción para crear tuberías compuestas.

El shell interpreta los símbolos <, >y >>como instrucciones para redirigir la entrada o salida de un comando hacia o desde un archivo.

Para conectar el STDOUT de un comando al STDIN de otro, use el | símbolo, comúnmente conocido como una tubería.

ps -ef | grep httpd

Básicamente, lo que esto está diciendo es que la entrada estándar es un comando que permite al usuario escribir en un archivo, mientras que la salida estándar es un comando que tiene la salida de escritura del shell bash en el shell, y el error estándar es como la salida pero solo es se invoca cuando hay un error en el sistema de archivos. Luego llegamos a la parte de conectar STDOUT y STDIN y estoy perdido.

JohnMerlino
fuente

Respuestas:

25

La entrada estándar y la salida estándar no son comandos.

Imagine comandos como máquinas en una fábrica con una línea de montaje. La mayoría de las máquinas están diseñadas para tener una cinta transportadora para alimentar datos y una cinta transportadora para alimentar datos; son la entrada estándar y la salida estándar respectivamente. El error estándar es una abertura en el costado de la máquina donde puede expulsar rechazos.

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

El diagrama anterior muestra una cinta transportadora que atraviesa dos máquinas. Los datos provienen del depósito de entrada a la izquierda, se alimentan a la máquina A, luego la salida se transporta más a la máquina B (para la cual se ingresa), y la salida de la máquina B se deposita en el cubo de salida a la derecha.

En términos unix, esto se llama una tubería . La metáfora es la de plomería: una tubería conecta la máquina A a la máquina B. La sintaxis de la carcasa de la tubería anterior es

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

El símbolo de < redirección le dice al shell que conecte commandAla entrada estándar del archivo al archivo input-file.txtantes de iniciarlo commandA. (Puede poner la redirección antes o después del nombre del comando). El >símbolo de redirección le dice al shell que conecte commandBla salida estándar output-file.txt. El |símbolo de canalización (" ") en el medio le dice al shell que conecte commandAla salida commandBestándar de la entrada estándar antes de iniciarlos.

Los comandos pueden tener más de una entrada y más de una salida, pero eso es material para otro día .

Gilles 'SO- deja de ser malvado'
fuente
3
Lo visual ayudó mucho
JohnMerlino
Buena analogía He entendido el concepto de la tubería de transmisión durante muchos años, pero de alguna manera nadie ha utilizado la analogía de fábrica / transportador, lo que lo hace realmente fácil (y sucinto) comprensible. ¡Gracias!
Owen Blacker
1
Gran analogía Voy a pedir prestado este si no te importa.
Tivie
Gilles, he hecho una pregunta sobre tu frase en la parte inferior: unix.stackexchange.com/q/96724/29146 . podrías aclarar?
Strugee
@Gilles: ¿puede incluir un ejemplo que ilustre la opción de definir la redirección antes o después del comando? Por ejemplo, ¿puede la tubería leerse como input-file.txt> commandA o input-file.txt <commandA?
Motivado el
6

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

No es un comando, sino una secuencia. Las entradas y salidas estándar son como buzones. Cuando se inicia un programa, se le da un cuadro para recibir y un cuadro para enviar correo. Por lo general, la entrada proviene del teclado y se coloca en la bandeja de entrada, el correo que se coloca en la bandeja de salida termina en la pantalla de su terminal.

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

El programa en realidad no sabe dónde salen los puntos estándar. Cuando canaliza A a B (como en $ A | B), cuando A coloca el correo en la bandeja de salida, termina en la bandeja de entrada de B. B procesa la entrada y pone su propio correo en la bandeja de salida, que es lo que ve en el terminal.

Para descartar la metáfora, como se mencionó, las entradas / salidas estándar son flujos. El buzón o el descriptor de archivo es un extremo de la secuencia. Conectar es conectar el estándar de A al estándar de B.

Astilla del caos
fuente