Um pipe executa o processo produtor (à esquerda) e o processo do consumidor (mão direita) em paralelo. Como existem dois processos em paralelo, pelo menos um deles precisa ser um processo filho do processo shell principal, possivelmente ambos.
A maioria dos shells executa ambos os lados do pipe em subprocessos. ATT ksh e zsh executam o lado direito no processo original.
O comando cd
altera o diretório atual do processo do shell atual, portanto precisa ser um builtin . Já que o lado esquerdo do pipe é executado em um subshell (um subprocesso que é bifurcado do processo do shell executando o script), o comando cd
só entra em vigor na subshell. Funciona, mas como o subshell sai imediatamente depois, ele não faz nada útil. Você pode observá-lo com
{ cd /tmp; echo -n "left-hand side: "; pwd; } |
{ cd /usr; echo -n "right-hand side: "; pwd; }
echo -n "parent: "; pwd
Para registrar a saída do seu script, crie um único pipeline que se aplique ao script inteiro.
main () {
… # whole script goes here
}
main | logger