Redirecionar stdout para stderr em tcsh

4

Pelo que entendi, o seguinte deve enviar ' test ' no erro padrão em tcsh:

echo test >&2

No entanto, em vez disso, ele escreve ' test ' em um arquivo chamado 2 , e quando eu olho no meu histórico, descubro que o que realmente foi executado foi

echo test > & 2

Não sei qual camada está inserindo esses espaços, mas posso pará-lo de alguma forma? Se não, acho que sempre posso usar > /dev/stderr .

    
por Nate Parsons 23.05.2012 / 16:28

4 respostas

5

Sobre o csh , do link :

Along these same lines, you can't direct error messages in csh scripts out stderr as is considered proper. In the Bourne shell, you might say:

echo "$0: cannot find $file" 1>&2

but in the csh, you can't redirect stdout out stderr, so you end up doing something silly like this:

sh -c 'echo "$0: cannot find $file" 1>&2'

Eu fiz algumas tentativas rápidas com tcsh e, como suspeito, parece que também é verdade ( tcsh é totalmente compatível com csh ).

Para resolver sua questão formulada: não importaria se você pudesse fazer com que tcsh não "inserisse espaços", uma vez que não interpretaria essa sequência da maneira pretendida de qualquer maneira.

    
por 24.05.2012 / 11:29
5

EDITAR:

Eu não vi isso foi tsch. Veja a seção "Entrada / saída" de man tsch para detalhes incluindo isto:

Diagnostic output may be directed through a pipe with the standard output. Simply use the form |& rather than just |.

The shell cannot presently redirect diagnostic output without also redirecting standard output, but (command > output-file) >& error-file is often an acceptable workaround. Either output-file or error-file may be /dev/tty to send out-put to the terminal.

    
por 23.05.2012 / 16:34
3

A solução de Daniel Andersson é ótima e funcionará bem se o comando que você deseja executar puder ser executado a partir do sh (e, portanto, um subshell, que não poderá alterar o diretório ou modificar o ambiente do shell atual). Se você quiser converter stdout para stderr mas manter a execução do comando no shell atual, você pode usar o bash apenas para o redirecionamento stdout-to-stderr, desta forma:

echo "An error message" | bash -c "cat - 1>&2"

    
por 30.04.2013 / 22:17
1

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.

    
por 01.03.2017 / 19:02