Como os processos canalizados são apresentados na saída do ps?

1

Eu tenho um script muito simples que segue diretório watches / tmp para novos arquivos e saída de inotifywait é canalizado para sed :

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | sed 's/a/b/'

Se eu verificar a saída de pstree , poderei ver que inotifywait e sed estão realmente em execução:

  |-bash(20568)---test(8208)-+-inotifywait(8209)
  |                          '-sed(8210)

Agora, se eu canalizar a saída de inotifywait para while, em vez de diretamente para sed :

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | 
  while IFS= read -r file; do
    sed 's/a/b/' "$file"
  done

.. de acordo com pstree :

    |-bash(20568)---test(8979)-+-inotifywait(8980)
    |                          '-test(8981)

.. e ps :

$ ps -p 8981 -o command
COMMAND
/bin/bash ./test
$

.. é o shell que é iniciado e não o utilitário externo sed . Estou certo de que isso é simplesmente porque while é o bash shell embutido?

    
por Martin 17.11.2015 / 14:24

1 resposta

1

A relação de processos em um pipe depende principalmente do shell que você usa.

Os shells modernos criam todos os processos simples (comandos) em um pipe direto para os filhos do shell principal.

Os shells mais antigos fazem isso de uma maneira diferente e específica da implementação.

Alguns shells executam um loop while dentro de um sub-shell quando a entrada é redirecionada, outros não.

while não é um comando interno do shell, mas parte da sintaxe do shell.

Conclusão: não tente analisar as relações pai / mãe em comandos complexos do shell, a menos que você seja o autor desse shell e goste de verificar se as coisas funcionam da maneira como elas são pretendidas neste shell específico.

    
por 17.11.2015 / 14:43