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 realmente estou procurando aqui é uma explicação de alto nível (fácil de entender) de pipes para iniciantes em Linux. Vejo outras perguntas sobre pipes aqui no Superusuário, mas nada que indique uma resposta que explique em termos simples o que eles fazem e como eles diferem do redirecionamento (o símbolo >
ou <
).
linux
command-line
bash
pipe
ccalvert
fonte
fonte
|
é 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.ls -1r
(Observe o argumento número um) deve produzir um resultado semelhante als | sort -r
.cat /somefile | grep cool
. Isso pegará a saída de somefile e a disponibilizará para grep; depois, o grep imprimirá todas as linhas com a palavra cool.Respostas:
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 usualstdin
é o teclado estdout
a tela ou a janela do terminal.Então, quando você executa
ls
, ele lança sua saída parastdout
. 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ê destdin
para aceitar as teclas digitadas, fazer as coisas e depois gravar as coisasstdout
.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: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 coisasstdin
e as classifica.Então, se fizermos isso:
# du /usr | sort -nr
nós entendemos isso, que é um pouco melhor:
E agora você pode ver que o "pipe" conecta o
stdout
comando de um aostdin
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á lerstdin
. Comostdin
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 comandotee
que permite que você pegue o seu bolo e o coma também; copie o que recebe destdin
para os doisstdout
e um arquivo de sua escolha. Você também pode fazer issobash
com alguma sintaxe misteriosa envolvendo e comercial e colchetes que eu não conheço.fonte
stdin
estdout
é diferente no Windows e no Linux, embora provavelmente não muito do ponto de vista do Windowscmd.exe
ou do Powershell.GetStdHandle()
. Também é trivial redirecionar os fluxos padrão de um processo [filho] gerado com o .NET, que eu acredito que mapeia para as funções do Win32 (mas não tenho 100% de certeza disso - não sou um desenvolvedor do Win32).STARTUPINFO
estrutura paraCreateProcess()
.Se você se sentir confortável com o redirecionamento de saída e entrada, a explicação é realmente bastante fácil.
faz o mesmo que
mas sem
tempfile
. A saída deCommand1
está diretamente conectada à entradaCommand2
e a transferência ocorre na memória.fonte
CreateFile
ou fazWriteFile
chamadas para apoiar sua reivindicação. / edit: Isso é para a parte do Windows, é claro.Realmente, se você quiser saber o que os pipes fazem e a diferença entre> e |, vá para um diretório com muitos arquivos e
de um terminal
ls
vsls | more
(ou fazendo isso no Windows com DIR e DIR | MORE)Se você usou> more, verá que ele cria um arquivo chamado 'more', em vez de enviar a saída de ls para o comando 'more'. Portanto, se alguém fizesse mais, provavelmente seria um erro, não faria mais> você faria> arquivo1. 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 normalmente uso 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 de padrão grep do formulário. grep com um parâmetro é padrão grep. E você pode enviar o arquivo canalizando o conteúdo do arquivo para ele ou usando <. Se estiver usando <, escreva primeiro o nome do comando e, em seguida, o nome do arquivo após o comando <file. Se estiver usando | para canalizar o conteúdo de um arquivo, você usa cat file1 | comando.
Além disso, muitos comandos recebem um arquivo como entrada de qualquer maneira, portanto, o grep a file1 funcionará, assim como o arquivo cat1 | 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 canal fica entre 2 comandos Os <e> ficam entre um comando e um arquivo. O> é gerado em um arquivo. A <é entrada de um arquivo.
fonte
O caractere de barra vertical (
|
) conecta a saída de um programa à entrada de outro.Neste exemplo,
echo
imprime a palavrahello
ewc -c
faz uma contagem de caracteres de sua entrada:fonte
Para entender isso, tente você mesmo:
Agora você está pendurado com um cursor e não está fazendo nada. O que acontece se você digitar alguns dados?
Ainda nada, certo? Agora pressione ctrl + D
Então, o que o tipo faz é pegar a entrada (o que você digitou), faz alguma coisa com ela (classifica) e a devolve como saída. O
ls
comando não aceita entrada, apenas gera saída. O símbolo de canal retira a saídals
e a alimenta como entrada para osort
comando.>
não alimenta a saída para um programa, mas armazena a saída como um arquivo.<
usa um arquivo como entrada.fonte