Перенаправление stderr в csh

Я запускаю программу, которая сбрасывает отчет о сбое в STDERR, откуда мне нужно отфильтровать некоторую необходимую информацию. Проблема в том, что я не могу перенаправить STDERR на STDOUT и PIPE с grep

command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl

Получение ошибки: Ambiguous output redirect.

Та же команда работает под терминалом bash. Что я должен изменить, чтобы заставить его работать?


person PYPL    schedule 14.08.2015    source источник


Ответы (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 в bash — поскольку stdout отбрасывается в подоболочке, ничего, записанное в stdout, никогда не попадет в канал.

person Filipe Gonçalves    schedule 14.08.2015
comment
Я думал, что обычным обходным путем было вызвать sh: sh -c "command 2>&1 > /dev/null" - person William Pursell; 14.08.2015
comment
@WilliamPursell Да, конечно. Я предположил, что он по какой-то причине хочет остаться в csh. - person Filipe Gonçalves; 14.08.2015
comment
лучший ответ на эту тему в Интернете. - person DDStackoverflow; 23.05.2020

Если вы не возражаете против смешивания stdout и stderr в канале, вы можете использовать

command |& grep "^[^-]" >& /tmp/fl

В противном случае вы можете сделать взлом:

(command >/dev/null) |& grep "^[^-]" >& /tmp/fl

который разделяет stdout на null, затем конвейер stdout и stderr просто дает stderr в качестве содержимого.

person meuh    schedule 14.08.2015