A tubulação para o arquivo não funciona com o canal intermediário [duplicado]

0

Isso está causando problemas:

node "$SUMAN_PROJECT_ROOT/server.js" | bunyan -o short &> ${LOG_FILE}  &

isso funciona:

node "$SUMAN_PROJECT_ROOT/server.js"  &> ${LOG_FILE}  & 

o problema é que, com o primeiro comando, a saída não está sendo enviada para o arquivo. No segundo comando, ele é enviado para o arquivo. Por que pode ser o caso do primeiro comando não funcionar - eu esperaria que ele enviasse a saída para o arquivo exatamente como o segundo comando. O comando bunyan deve agir como grep, apenas filtrar e mapear a saída do comando node.

Meu editor não gosta de uma solução proposta:

    
por Alexander Mills 06.09.2017 / 05:05

1 resposta

6
node "$SUMAN_PROJECT_ROOT/server.js"  &> ${LOG_FILE}  & 

Primeiro, vamos examinar o comando de trabalho.

Isto diz para pegar a saída padrão E erro padrão do comando node , e redirecionar ambos para o arquivo de log. (E você precisa citar sua variável; ela será interrompida se LOG_FILE incluir espaço em branco. Consulte Por que meu script de shell sufoca em espaços em branco ou outros? caracteres especiais? )

E o comando é colocado em segundo plano com & , mas isso não é relevante.

node "$SUMAN_PROJECT_ROOT/server.js" | bunyan -o short &> ${LOG_FILE}  &

Este comando que você diz não funciona. O que isto faz é pegar SOMENTE a saída padrão do comando node e passar para o comando bunyan , então redirecionar a saída padrão e o erro padrão do comando bunyan para o arquivo de log .

Como você diz que isso não funciona, a conclusão óbvia é que a saída em que você está interessado no comando node está sendo enviada para seu erro padrão, não sua saída padrão. Use &| ou use node ... 2>&1 | ... para que o erro padrão seja redirecionado também.

( &| é uma base, não é portável, mas é &> , então imagino que você não se importe com isso.)

    
por 06.09.2017 / 08:29