o que significa conectar STDOUT e STDIN?

10

Estou lendo um livro, ele diz:

Todo processo possui pelo menos três canais de comunicação disponíveis: “entrada padrão” (STDIN), “saída padrão” (STDOUT) e “erro padrão” (STDERR).

A maioria dos comandos aceita sua entrada de STDIN e grava sua saída em STDOUT. Eles escrevem mensagens de erro para STDERR. Essa convenção permite agrupar comandos como blocos de construção para criar pipelines compostos.

O shell interpreta os símbolos <, >e >>como instruções para redirecionar a entrada ou saída de um comando para ou de um arquivo.

Para conectar o STDOUT de um comando ao STDIN de outro, use o | símbolo, geralmente conhecido como pipe.

ps -ef | grep httpd

Então, basicamente, o que isto está dizendo é que a entrada padrão é um comando que permite ao usuário gravar em um arquivo, enquanto a saída padrão é um comando que possui o shell bash para gravar o resultado no shell, e o erro padrão é exatamente como o resultado, mas é apenas chamado quando há um erro no sistema de arquivos. Então chegamos à parte de conectar STDOUT e STDIN e estou perdido.

JohnMerlino
fonte

Respostas:

25

Entrada e saída padrão não são comandos.

Imagine comandos como máquinas em uma fábrica com uma linha de montagem. A maioria das máquinas é projetada para ter uma correia transportadora para alimentar os dados e uma correia transportadora para alimentar os dados; eles são a entrada padrão e a saída padrão, respectivamente. O erro padrão é uma abertura na lateral da máquina onde ela pode ejetar rejeições.

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

O diagrama acima mostra uma correia transportadora que passa por duas máquinas. Os dados são provenientes do reservatório de entrada à esquerda, são alimentados na máquina A e, em seguida, a saída é transportada para a máquina B (para a qual é entrada), e a saída da máquina B é depositada no balde de saída à direita.

Em termos unix, isso é chamado de pipeline . A metáfora é a do encanamento: um tubo conecta a máquina A à máquina B. A sintaxe da casca do oleoduto acima é

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

O símbolo de < redirecionamento informa ao shell para conectar commandAa entrada padrão do arquivo ao arquivo input-file.txtantes de iniciar commandA. (Você pode colocar o redirecionamento antes ou depois do nome do comando.) O >símbolo de redirecionamento informa ao shell para conectar commandBa saída padrão output-file.txt. O |símbolo do tubo (" ") no meio diz ao shell para conectar commandAa saída commandBpadrão da entrada padrão antes de iniciá-los.

Os comandos podem ter mais de uma entrada e mais de uma saída, mas isso é material para outro dia .

Gilles 'SO- parar de ser mau'
fonte
3
O visual ajudou muito
JohnMerlino
Boa analogia. Eu entendo o conceito de pipeline de fluxo há muitos anos, mas de alguma forma ninguém jamais usou a analogia de fábrica / transportador, o que o torna realmente fácil (e sucintamente) compreensível. Obrigado!
Owen Blacker
1
Ótima analogia. Indo emprestar este aqui se você não se importa.
Tivie
Gilles, fiz uma pergunta sobre seu fraseado na parte inferior: unix.stackexchange.com/q/96724/29146 . você poderia esclarecer?
strugee
@Gilles - Você pode incluir um exemplo que ilustra a opção de definir o redirecionamento antes ou depois do comando? Por exemplo, o pipeline pode ler como input-file.txt> commandA ou input-file.txt <commandA?
Motivado
6

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

Não é um comando, mas um fluxo. As entradas e saídas padrão são como caixas de correio. Quando um programa é iniciado, recebe uma caixa para receber e uma para enviar e-mail. Geralmente, a entrada é proveniente do teclado e é colocada na caixa de entrada, o correio na caixa de saída termina na tela do terminal.

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

O programa realmente não sabe onde pontos de saída padrão. Quando você canaliza A para B (como em $ A | B), quando A coloca a correspondência na caixa de saída, ela termina na caixa de entrada de B. B processa a entrada e coloca sua própria correspondência na caixa de saída, que é o que você vê no terminal.

Para soltar a metáfora, como mencionado, a entrada / saída padrão são fluxos. A caixa de correio, ou descritor de arquivo , é uma extremidade do fluxo. Tubo é conectar o padrão de A ao padrão de B.

Lasca do Caos
fonte