Eu fiz algumas experiências com direcionamento para / dev / stderr em um script tcsh. Minhas
intenção era para o usuário do script poder (também em tcsh) direto
saída padrão e erro padrão para diferentes locais. Eu achei que o
script teve que se parecer com:
echo 1abc
echo 1ABC >>& /dev/stderr
echo 2abc
echo 2ABC >>& /dev/stderr
Se você não usar > & gt ;, na saída do script redirecionado, perderá
alguns dos dados de entrada padrão e / ou saída padrão. Mesmo assim, redirecionando
a saída do script para um arquivo usando simplesmente > & não não funciona; isso também
perde parte do erro padrão (mesmo no bash). Você deve usar
(SCRIPT >! file.out ) >&! file.err
construção. Aqui, arquivo ou ambos podem ser / dev / tty para saída na tela.
(Se você não redirecionar a saída do script, nunca haverá um problema.)
Note que nenhuma dessas estranhezas ocorre se você direcionar ao erro padrão de
dentro de um programa.
Observe também que isso foi no Linux (Ubuntu-Mate LTS 16.04, para ser preciso). É claro que você precisa de pelo menos / dev / stderr para existir acima para ser utilizável.
Depois de postar isso, achei outro problema. Se você colocar um programa que grava em erro padrão após a linha 1ABC, o 1ABC será perdido se você
erro padrão direto para um arquivo. A boa notícia é que no meu caso, padrão
erro deve continuar a ir para / dev / tty. Nossa. :)
Para facilitar a modificação e sistemas sem o / dev / stderr, decidi implementar isso através das duas linhas de cabeçalho a seguir
alias stderr echo ; if (-ew /dev/stderr) alias stderr 'echo \!* >> /dev/stderr'
which echo_err > /dev/null ; if !($status) alias stderr echo_err
Isto permite ao usuário colocar um script sh echo_err,
#!/bin/sh
echo $* 1>&2
no caminho, se o redirecionamento livre de erros do erro padrão for realmente necessário
despesa de duas ativações de imagem).
Outra adição: Meu post acima foi sobre problemas em redirecionar para / dev / stderr
dentro do tcsh. Mas enquanto eu estiver dando pseudônimos, talvez eu também deva dar
um para a solução de Glen Ragan, que é realmente muito bom se você não se importa
uma ativação de imagem. Definir
alias 1to2 '\!* | sh -c "cat 1>&2"'
alias 2to1 '\!* |& cat'
Em seguida, você pode preceder qualquer comando para o qual deseja que a saída padrão seja redirecionada para stdout por 1to2. Isso atua como precedendo o comando por 1 > & 2 em outros shells, incluindo o DOS. E não é buggy no Linux. Pode também ter um 2to1 também, então. :)
OOPS: Uma pequena falha em 1to2 acima: se o comando gravar na saída padrão e no erro padrão, a ordem está errada. O material do erro padrão do comando acaba antes de seu material de saída padrão no resultado final do erro padrão. A solução é simples; mudança | em | &:
alias 1to2 '\!* |& sh -c "cat 1>&2"'
Desculpe por isso.