redirecionamento stderr não funciona em csh

redirecionamento stderr não funciona em csh

Eu executo o seguinte comando:

pkg_add emacs-23.4,2.tbz 2> output.log

A saída ainda é exibida no terminal. Quando pressiono , recebo

pkg_add emacs-23.4,2.tbz 2 > output.log

com um espaço antes do2.

Eu não coloquei isso originalmente. eu tento

pkg_add emacs-23.4,2.tbz > output.log 2>&1

Novamente, quando pressiono ,espaços foram adicionados.

Por que isto está acontecendo comigo?

Estou executando o csh no FreeBSD.

Responder1

Não tenho certeza se você está tentando ocultar o STDERR ou redirecioná-lo para STDOUT.

Para redirecionar STDOUT para um arquivo:

pkg_add emacs-23.4,2.tbz > stdout.log

Para redirecionar STDOUT e STDERR para um arquivo:

pkg_add emacs-23.4,2.tbz > & stdxxx.log

Para redirecionar STDOUT para um arquivo e ocultar STDERR:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & /dev/null

Para redirecionar STDOUT para console e ocultar STDERR:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & /dev/null

Para redirecionar STDOUT para console e STDERR para um arquivo:

( pkg_add emacs-23.4,2.tbz > /dev/tty ) > & stderr.log

Para redirecionar STDOUT para um arquivo e STDERR para um arquivo:

( pkg_add emacs-23.4,2.tbz > stdout.log ) > & stderr.log

EDIT: A razão pela qual isso funciona é que a ação em () acontece primeiro; Portanto, se redirecionarmos STDOUT, ele não estará mais disponível fora de (). Isso nos deixa apenas com STDERR, e então podemos redirecioná-lo conforme desejado.

Responder2

O redirecionamento 2> não funciona com csh ou tcsh.

Use o chshcomando para alterar seu shell para /bin/sh ou /usr/local/bin/bash para usar o 2>redirecionamento de estilo.Observação:Não altere o shell do root para /usr/local/bin/bash

csh e tcsh não podem redirecionar saída padrão e erro separadamente, mas >&redirecionarão a saída combinada para um arquivo.

Responder3

Eu sei fazer isso em Csh, mas usando 2 shells:

csh -c 'SOME_COMMAND 1>/dev/null' |& tee file.txt

Tal forma permite redirecionarapenasstderr para file.txt, sem stdout - ou seja, o que você queria.

Responder4

Em relação à resposta do nikc, para obter o mesmo comportamento dos shells Bourne, em vez de /dev/tty, use um FIFO.

Para redirecionar STDOUT para console e ocultar STDERR:

mkfifo stdout
( pkg install -y emacs > stdout ) >& /dev/null & cat stdout

Para redirecionar STDERR para console e ocultar STDOUT:

pkg install -y emacs > /dev/null

informação relacionada