Трубопроводы как stdout, так и stderr в bash?



кажется, что новые версии bash имеют &> оператор, который (если я правильно понимаю) перенаправляет как stdout, так и stderr в файл (&>> добавляет к файлу вместо этого, как пояснил Адриан).



каков самый простой способ добиться того же самого, но вместо этого передать другую команду?



например, в этой строке:



cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError


Я бы хотел, чтобы grep соответствовал содержимому как в stdout, так и в stderr (эффективно, чтобы они объединялись в один поток.)



Примечание: этот вопрос задается о piping, не перенаправление-так что это не дубликат вопроса, который в настоящее время помечен как дубликат.

548   2  

2 ответов:

(обратите внимание, что &>>fileдобавляет в файл &> перенаправление и перезаписать ранее существующий файл.)

объединить stdout и stderr вы бы перенаправить последний на первый с помощью 2>&1. Это перенаправляет стандартный поток ошибок (дескриптор 2) на стандартный вывод (дескриптор 1), например:

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdout идет в stdout, stderr идет в stderr. grep видит только stdout, следовательно,stderr печать на терминал.

С другой стороны:

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

после записи в оба stdout и stderr,2>&1 перенаправляет stderr обратно в stdout и grep видит обе строки на stdin, таким образом отфильтровывает оба.

вы можете узнать больше о перенаправлении здесь.

относительно вашего примера (POSIX):

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

или >=bash-4:

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

Баш имеет сокращение для 2>&1 |, а именно |&, который трубит как stdout, так и stderr (см. руководство):

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

Это было введено в bash 4.0 см. заметки.

Comments

    Ничего не найдено.