O seguinte é um pouco simplificado para ajudar novos usuários.
Bem, primeiro, é necessário entender o conceito de entrada e saída padrão.
No Linux e em outros sistemas operacionais do tipo UNIX, cada processo possui uma entrada padrão ( stdin
) e uma saída padrão ( stdout
). A situação usual stdin
é o teclado e stdout
a tela ou a janela do terminal.
Então, quando você executa ls
, ele lança sua saída para stdout
. Se você não fizer mais nada, ele será exibido na tela ou na janela do terminal e você será exibido.
Agora, alguns comandos do Linux interagem com o usuário e costumam stdin
fazer isso, sendo seu editor de texto um deles. Ele lê de stdin
para aceitar as teclas digitadas, fazer as coisas e depois gravar as coisas stdout
.
No entanto, também existem comandos não interativos ou de "filtro" que NÃO funcionam interativamente, mas desejam um monte de dados. Esses comandos pegam tudo o que stdin
tem, fazem alguma coisa e jogam parastdout
Vejamos outro comando chamado du
- significa uso de disco. du /usr
, por exemplo, imprimirá ( stdout
como qualquer outro comando do Linux) uma lista de todos os arquivos nesse 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 dizer logo de cara, ele não está classificado, e você provavelmente o quer em ordem de tamanho.
sort
é um daqueles comandos de "filtro" que pega várias coisas stdin
e as classifica.
Então, se fizermos isso:
# du /usr | sort -nr
nós entendemos isso, 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 "pipe" conecta o stdout
comando de um ao stdin
outro. Normalmente, você o utilizará em situações como esta em que deseja filtrar, classificar ou manipular a saída de um comando. Eles podem ser colocados em cascata se você desejar processar a saída por meio de vários comandos do tipo filtro.
Se você digitar sort
por si só, ele ainda tentará ler stdin
. Como stdin
está conectado ao teclado, ele estará aguardando você digitar e processar as coisas até pressionar Control-D. Isso não será solicitado, pois não é para ser usado de maneira 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 maneira interativa vi
resultará em problemas para você.
Os canais são diferentes do redirecionamento, pois os dados são embaralhados de um comando para o outro sem serem armazenados em nenhum lugar. Portanto, no exemplo acima, du
a saída de não é armazenada em nenhum lugar. Na maioria das vezes, você não deseja isso com pipes, porque o motivo para usá-los é processar a saída de um comando de alguma maneira - mas existe um comando tee
que permite que você pegue o seu bolo e o coma também; copie o que recebe de stdin
para os dois stdout
e um arquivo de sua escolha. Você também pode fazer isso bash
com alguma sintaxe misteriosa envolvendo e comercial e colchetes que eu não conheço.
|
é que ele não usa um nome; a saída do comando l-hand é passada diretamente para a entrada do comando no lado r do lado do tubo.