Pelo que entendi, o pipe ( | )
pega a saída padrão de um processo e a passa como entrada padrão para outro processo.
Mas eu quero saber se pipe ( | )
é considerado um comando como ls, grep etc.
Quantos comandos estão na linha de comando abaixo?
ls /etc | grep nginx
Estou confuso se devo contar o cachimbo( | )
No Bash, um pipe (
|
junto com|&
) não é um comando, mas um operador de controle.A partir desta referência :
Então no contexto do seu exemplo,
ls
egrep
seriam os comandos e você não deveria incluir o pipe.A prova está em testes reais. Em bash:
retorna:
enquanto:
onde a e b são comandos desconhecidos, retorna:
sem referência a | como o pipe está perfeitamente bem quando usado entre dois comandos arbitrários, o problema é que esses comandos não existem.
Eu suspeito que "b: comando não encontrado" vem primeiro porque, em ordem, o receptor (b) deve estar sendo executado antes do remetente (a). Se eles fossem iniciados (a) e depois (b), se (b) levasse mais tempo para iniciar do que (a) levasse para iniciar o envio, os dados não teriam para onde ir.
Para complementar a outra resposta: o operador pipe informa ao shell que os dois comandos devem ser organizados em um pipeline, como no fluxo de texto de um para o outro. Para isso, o shell cria um pipe anônimo, ou seja, um canal tipo arquivo FIFO, chamando o kernel. Em seguida, o shell executa os dois comandos, passando a entrada do pipe para o primeiro comando como seu descritor de arquivo stdout e a saída do pipe para o segundo comando como seu stdin. Então o texto vai de stdout do primeiro comando para stdin do segundo através do pipe.
Se o símbolo de pipe denotasse um comando separado, esse programa precisaria se apossar dos processos dos outros dois comandos de alguma forma, então passar os descritores de arquivo para o pipe anônimo para eles (assumindo que isso seja possível entre processos que não são pai e filho ), e esses programas precisariam trocar seus stdout e stdin por esses descritores, quando já estiverem em execução - sob o risco de perda potencial de saída nesse meio tempo. Isso tudo é mais fácil de realizar pelo shell, que já conhece os dois processos, tem um relacionamento pai especial com eles e pode fornecer os descritores de arquivo logo no início.