Я запускаю следующую команду:
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