redirecionamento stderr não funciona no csh

11

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

Mais uma vez, quando pressiono , foram adicionados espaços .

Por que isto está acontecendo comigo?

Estou executando o csh no FreeBSD.

gadgetmo
fonte

Respostas:

12

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>estilo redirecionado. Nota: Não altere o shell do root para / usr / local / bin / bash

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

Craig
fonte
+1 e ✔. Eu mudei conchas usando sh.
gadgetmo
1
@ Craig Ele está rodando pkg_addno FreeBSD, então estou assumindo que isso é para o usuário root (/ bin / csh é o padrão para root no FreeBSD). Nesse caso, você não deve alterar o shell para / usr / local / bin / bash. / bin / sh é aceitável. Você também pode mudar para outro shell após fazer login como root.
James O'Gorman
@ JamesO'Gorman Boa captura Eu atualizei minha resposta.
Craig
20

Não tenho certeza se você está tentando ocultar o STDERR ou redirecioná-lo para o 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 o STDOUT para o console e ocultar o STDERR:

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

Para redirecionar STDOUT para o 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 no () acontece primeiro; Portanto, se redirecionarmos o STDOUT, ele não estará mais disponível fora dos (). Isso nos deixa com apenas STDERR e podemos redirecioná-lo conforme desejado.

nikc
fonte
Olá @nikc, bem-vindo ao unix.SE. Seu comentário é útil e informativo. Sugiro editar sua resposta e incluí-la ali, para que não seja tão facilmente esquecida.
DRS
1

Eu sei como fazê-lo no Csh, mas usando 2 conchas:

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

Dessa maneira, você pode redirecionar apenas o stderr para o arquivo.txt, sem o stdout - ou seja, o que você deseja.

Alexander Samoylov
fonte