Перенаправление stderr в csh
Я выполняю программу, которая выводит отчет о сбое в STDERR
откуда я должен фильтровать некоторую необходимую информацию. Проблема в том, что я не могу перенаправить STDERR
в STDOUT
а также PIPE
это с grep
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
Получение ошибки: Ambiguous output redirect.
Та же команда работает под терминалом bash. Что я должен изменить, чтобы это работало?
2 ответа
csh
значительно более ограничен, чем bash, когда дело доходит до перенаправления файлов. В csh
Вы можете перенаправить stdout
с обычным >
оператор, вы можете перенаправить оба stdout
а также stderr
с >&
оператор, вы можете трубу stdout
а также stderr
с |&
оператор, но нет одного оператора для перенаправления stderr
в одиночестве.
Обычный обходной путь - выполнить команду в под-оболочке, перенаправив stdout
в этой вложенной оболочке в любой файл, который вы хотите (/dev/null
в этом случае), а затем используйте |&
оператор для перенаправления stdout
а также stderr
суб-оболочки для следующей команды в основной оболочке.
В вашем случае это означает что-то вроде:
( command >/dev/null ) |& grep "^[^-]" >&/tmp/fl
Так как stdout
перенаправлен на /dev/null
внутри под-оболочки, |&
оператор в конечном итоге действует как 2>&1
в Баш - с stdout
отбрасывается в под-оболочку, ничего не написано stdout
когда-нибудь достигнет трубы.
Если вы не возражаете смешивать stdout и stderr в трубу, вы можете использовать
command |& grep "^[^-]" >& /tmp/fl
В противном случае вы можете сделать взломать:
(command >/dev/null) |& grep "^[^-]" >& /tmp/fl
который отделяет stdout в ноль, затем отправляет stdout и stderr просто дает stderr в качестве содержимого.