CD com redirecionamento para logger não funciona

2

No Linux, o seguinte cd funciona bem, então cds no tmp:

/ # cd /tmp
tmp # 

Mas isso não funciona (fica na raiz, nada aparece em / var / log / messages). Por que não?

/ # cd /tmp 2>&1 | /usr/bin/logger -t Test
/ #

Eu tentei remover esse redirecionamento stderr, mas isso também não funcionou.

Meu objetivo é redirecionar todas as saídas do meu script para o syslog, assim também se eu tentar CD em um diretório que não existe / permissão negada / etc. Por que não está funcionando e como fazer isso funcionar?

Um eco normal é impresso no syslog para que funcione:

echo Test | /usr/bin/logger -t Test
    
por robert 01.08.2015 / 09:14

1 resposta

2

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
    
por 01.08.2015 / 23:13