O seguinte é simplificado um pouco para ajudar novos usuários.
Primeiramente, é necessário entender o conceito de entrada padrão e saída padrão.
No Linux e em outros sistemas operacionais semelhantes ao UNIX, cada processo tem uma entrada padrão ( stdin
) e uma saída padrão ( stdout
). A situação usual é que stdin
é seu teclado e stdout
é sua tela ou janela de terminal.
Portanto, quando você executar ls
, ele emitirá sua saída para stdout
. Se você não fizer mais nada, ele irá para sua tela ou janela de terminal, e você irá visualizá-lo.
Agora, alguns comandos do Linux interagem com o usuário e usam stdin
para fazer isso, e seu editor de texto é um deles. Ele lê a partir de stdin
para aceitar os pressionamentos de tecla, fazer as coisas e, em seguida, grava as informações em stdout
.
No entanto, também existem comandos não interativos ou de "filtro" que NÃO funcionam de forma interativa, mas desejam um conjunto de dados. Esses comandos pegarão tudo stdin
, farão algo com isso e, em seguida, o lançarão em stdout
Vamos ver outro comando chamado du
- significa uso do disco. du /usr
, por exemplo, imprimirá (para stdout
como qualquer outro comando do Linux) uma lista de todos os arquivos desse diretório e seu tamanho:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
Como você pode ver logo de cara, ele não está classificado, e você provavelmente quer que ele seja classificado em ordem de tamanho.
sort
é um daqueles comandos "filter" que pegará um monte de coisas de stdin
e as classificará.
Então, se fizermos isso:
# du /usr | sort -nr
recebemos isso, o que é um pouco melhor:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
E agora você pode ver que o "canal" conecta o stdout
de um comando ao stdin
do outro. Normalmente você irá usá-lo em situações como esta, onde você deseja filtrar, classificar ou manipular a saída de um comando. Eles podem ser colocados em cascata se você quiser processar a saída por meio de vários comandos do tipo de filtro.
Se você digitar sort
por si só, ele ainda tentará ler a partir de stdin
. Como stdin
está conectado ao seu teclado, ele estará aguardando que você digite e processe as coisas até que você pressione Control-D. Isso não vai te pedir uma vez que não é realmente destinado a ser usado de forma interativa.
É possível que um programa diga se stdin
é interativo ou não, portanto, alguns programas podem agir de maneira diferente se você os emitir sozinhos ou no final de um canal.
Além disso, canalizar um programa que funcione apenas de forma interativa, como vi
, resultará em um momento ruim.
Os pipes são diferentes do redirecionamento, pois os dados são arrastados de um comando para o outro sem serem armazenados em nenhum lugar. Portanto, no exemplo acima, a saída de du
não é armazenada em nenhum lugar. A maior parte do tempo você não quer isso com pipes porque o motivo para usar pipes é processar a saída de um comando de alguma forma - mas, existe um comando tee
que permite que você tenha seu bolo e coma também , copiará o que recebe de stdin
para stdout
e um arquivo de sua escolha. Você também pode fazer isso de bash
com alguma sintaxe arcana envolvendo "e" comercial e colchetes que eu não conheço.