O que faz o símbolo do tubo de linux “|”? [duplicado]

20

Aqui está um comando que classifica os arquivos em uma pasta na ordem inversa

ls | sort -r

O que o símbolo | nesse comando faz?

O que eu realmente estou procurando aqui é uma explicação de alto nível (fácil de entender) de pipes para iniciantes em Linux. Eu vejo outras perguntas sobre pipes aqui no Superuser, mas nada que elicia uma resposta que explique em termos simples o que eles fazem e como eles diferem do redirecionamento (o símbolo > ou < ).

    
por ccalvert 19.05.2014 / 18:25

5 respostas

24

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.

    
por 19.05.2014 / 23:32
26

Se você estiver confortável com o redirecionamento de saída e entrada, a explicação é realmente muito fácil.

Command1 | Command2

faz o mesmo que

Command1 > tempfile
Command2 < tempfile

mas sem tempfile . A saída de Command1 está diretamente conectada à entrada de Command2 e a transferência acontece na memória.

    
por 19.05.2014 / 18:42
3

Realmente, se você quiser saber o que os canais fazem e a diferença entre > e |, em seguida, vá para um diretório com muitos arquivos e

de um terminal ls vs ls | more (ou fazendo isso do Windows com DIR e DIR | MORE)

Se você usou > mais você verá que cria um arquivo chamado 'more' em vez de enviar a saída de ls para o comando 'more'. Então, se alguém fez > mais provavelmente seria um erro, não se faria mais > mais você faria > file1. Mais é um comando bem conhecido.

O < como o > é também para vincular um comando e um arquivo, em vez de um comando para um comando. Mas enquanto > envia a saída de um comando para um arquivo, o < envia um arquivo como entrada para um comando. Eu raramente uso < como eu costumo usar cat file1 | para enviar a saída de um arquivo para um comando.

$ grep a < arquivo1 abc

$ cat file1 | grep a abc

grep com 2 parâmetros é do arquivo padrão grep do formulário. grep com um parâmetro é o padrão grep. E você pode enviar o arquivo canalizando o conteúdo do arquivo para ele ou usando & lt ;. Se usar & lt ;, você escreve primeiro o nome do comando, depois o nome do arquivo depois do comando < Arquivo. Se usando | para canalizar o conteúdo de um arquivo, você usa cat file1 | comando.

Também muitos comandos pegam um arquivo como entrada de qualquer forma, então o arquivo 1 funcionará como o arquivo file1 | grep a e grep a < arquivo1.

Eu estava fazendo pipes (|) e > no DOS até 15 anos atrás.

Para resumir como | difere de < e > - O pipe fica entre dois comandos O < e > sit entre um comando e um arquivo. O > é enviado para um arquivo. O < é a entrada de um arquivo.

    
por 20.05.2014 / 00:00
3

O caractere de pipe ( | ) conecta a saída de um programa à entrada de outro.

Neste exemplo, echo imprime a palavra hello e wc -c faz uma contagem de caracteres de sua entrada:

echo hello | wc -c
    
por 20.05.2014 / 00:12
2

Para entender isso, tente você mesmo:

sort -r

Agora você está pendurado com um cursor e não está fazendo nada. O que acontece se você digitar alguns dados?

1
2
3
5
4

Ainda nada, certo? Agora pressione ctrl + D

5
4
3
2
1

Então, que tipo faz é, demora de entrada (o que você digitou), faz algo com ele (tipos) e dá-lo de volta como saída. O comando ls não recebe entrada, apenas gera saída. O símbolo de pipe obtém a saída de ls e a alimenta como entrada para o comando sort .

> não alimenta a saída para um programa, mas armazena a saída como um arquivo. < usa um arquivo como entrada.

    
por 19.05.2014 / 19:16