Como o bash builtins trabalha com pipeline

0

Bash o builtins define como:

The shell executes the command directly, without invoking another program.

E um canal como foo | bar funciona mais ou menos assim: bar aguarda entradas de foo e foo sai primeiro e, em seguida, bar sair.

No bash, um pipeline como este funciona como esperado:

$ history | grep curl

Mas como grep consegue saber que history faz seu trabalho e sai? Desde history , que é um builtin, não estava gerando novo processo. O history gera um sinal EOF ou algo assim?

    
por mitnk 25.09.2018 / 05:47

1 resposta

1

Quando o manual diz "sem invocar outro programa", significa que o shell não usa execve para executar outros programas. Quando um comando usa redirecionamento, a implementação simples é para fork de outro processo e faz o redirecionamento apenas para esse processo, deixando os descritores de arquivo do shell pai não modificados. Isso também é o que o bash faz com este comando, como pode ser verificado com strace .

É possível fazer alguns truques e evitar os garfos para comandos internos, mas parece que eles não são usados neste caso.

O segundo programa não pode detectar que o primeiro programa sai, ele só pode detectar que o lado de saída do canal foi fechado (o que pode acontecer porque o programa foi encerrado ou devido a um close regular). O lado da leitura do tubo receberá um EOF.

É comum, mas não necessário, que o primeiro programa em um pipe saia primeiro. Considere:

sleep 10 | echo done

Se o segundo programa do pipe sair antes do primeiro e o primeiro tentar gravar no pipe, ele receberá o sinal SIGPIPE , que terminará o processo, a menos que seja capturado.

(sleep 10; echo test ) | echo done
    
por 25.09.2018 / 07:31