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

11

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

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.

gadgetmo
источник

Ответы:

12

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

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

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

Craig
источник
+1 и ✔. Я изменил снаряды, используя sh.
gadgetmo
1
@Craig Он работает pkg_addна FreeBSD, поэтому я предполагаю, что это для пользователя root (/ bin / csh по умолчанию для root во FreeBSD). В этом случае вам не следует менять оболочку на / usr / local / bin / bash. / bin / sh является приемлемым. Вы также можете просто переключиться на другую оболочку после входа в систему как root.
Джеймс О'Горман
@ JamesO'Gorman Хорошо, я обновил свой ответ.
Крейг
20

Я не уверен, пытаетесь ли вы скрыть 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

РЕДАКТИРОВАТЬ: Причина, почему это работает, в том, что действие в () происходит в первую очередь; Следовательно, если мы перенаправили STDOUT, он больше не будет доступен за пределами (). Это оставляет нам только STDERR, и тогда мы можем перенаправить его по желанию.

nikc
источник
Привет @nikc, добро пожаловать в unix.SE. Ваш комментарий полезен и информативен. Я бы посоветовал отредактировать ваш ответ и включить его прямо там, чтобы его не было так легко пропустить.
DRS
1

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

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

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

Александр Самойлов
источник