O pipe é usado para transmitir a saída para outro programa ou utilitário .
O redirecionamento é usado para transmitir a saída para um arquivo ou fluxo .
Exemplo: thing1 > thing2
vs thing1 | thing2
thing1 > thing2
- Seu shell executará o programa chamado
thing1
- Tudo o que as
thing1
de saídas serão colocadas em um arquivo chamadothing2
. (Nota - sething2
existir, será sobrescrito)
Se você quiser passar a saída do programa thing1
para um programa chamado thing2
, poderá fazer o seguinte:
thing1 > temp_file && thing2 < temp_file
qual seria
- execute o programa chamado
thing1
- salve a saída em um arquivo chamado
temp_file
- execute o programa chamado
thing2
, fingindo que a pessoa no teclado digitou o conteúdo detemp_file
como entrada.
No entanto, isso é desajeitado, então eles criaram pipes como uma forma mais simples de fazer isso. thing1 | thing2
faz o mesmo que thing1 > temp_file && thing2 < temp_file
EDIT para fornecer mais detalhes para questionar no comentário:
Se >
tentasse ser "passar para o programa" e "gravar no arquivo", isso poderia causar problemas em ambas as direções.
Primeiro exemplo: Você está tentando gravar em um arquivo. Já existe um arquivo com esse nome que você deseja sobrescrever. No entanto, o arquivo é executável. Presumivelmente, tentaria executar este arquivo, passando a entrada. Você teria que fazer algo como gravar a saída em um novo nome de arquivo e renomeá-lo.
Segundo exemplo: Como Florian Diesch apontou, e se houver outro comando em outro lugar no sistema com o mesmo nome (que está no caminho de execução). Se você pretendia criar um arquivo com esse nome em sua pasta atual, você estaria preso.
Em terceiro lugar: se você digitar errado um comando, ele não o avisará que o comando não existe. No momento, se você digitar ls | gerp log.txt
, ele informará bash: gerp: command not found
. Se >
significasse ambos, simplesmente criaria um novo arquivo para você (então avise que ele não sabe o que fazer com log.txt
).