перенаправление stderr не работает в csh

перенаправление stderr не работает в csh

Я запускаю следующую команду:

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

Вывод все еще отображается в терминале. Когда я нажимаю , я получаю

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

с пробелом перед2.

Я изначально не ставил этого. Я пытаюсь

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

Опять же, когда я нажимаю ,пробелы были добавлены.

Почему это происходит со мной?

Я использую csh на FreeBSD.

решение1

Я не уверен, пытаетесь ли вы скрыть STDERR или перенаправить его в STDOUT.

Чтобы перенаправить STDOUT в файл:

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

Чтобы перенаправить STDOUT и STDERR в файл:

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

Чтобы перенаправить STDOUT в файл и скрыть STDERR:

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

Чтобы перенаправить STDOUT на консоль и скрыть STDERR:

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

Чтобы перенаправить STDOUT на консоль, а STDERR в файл:

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

Чтобы перенаправить STDOUT в файл и STDERR в файл:

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

EDIT: Причина, по которой это работает, заключается в том, что действие в () происходит первым; следовательно, если мы перенаправили STDOUT, то он больше не будет доступен за пределами (). Это оставляет нам только STDERR, и затем мы можем перенаправить его по желанию.

решение2

Перенаправление 2> не работает с csh или tcsh.

Используйте chshкоманду, чтобы изменить оболочку на /bin/sh или /usr/local/bin/bash, чтобы использовать 2>перенаправление стиля.Примечание:Не меняйте оболочку root на /usr/local/bin/bash

csh и tcsh не могут перенаправлять стандартный вывод и ошибки по отдельности, но >&перенаправляют объединенный вывод в файл.

решение3

Я знаю, как это сделать в Csh, но с использованием 2 оболочек:

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

Такой способ позволяет перенаправитьтолькоstderr в file.txt, без stdout - а именно то, что вы и хотели.

решение4

Что касается ответа nikc, чтобы добиться того же поведения оболочек Bourne, вместо /dev/tty, используйте FIFO.

Чтобы перенаправить STDOUT на консоль и скрыть STDERR:

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

Чтобы перенаправить STDERR на консоль и скрыть STDOUT:

pkg install -y emacs > /dev/null

Связанный контент