Перенаправление 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 в качестве содержимого.

Другие вопросы по тегам