Трубопроводы как stdout, так и stderr в bash?
кажется, что новые версии bash имеют &> оператор, который (если я правильно понимаю) перенаправляет как stdout, так и stderr в файл (&>> добавляет к файлу вместо этого, как пояснил Адриан).
каков самый простой способ добиться того же самого, но вместо этого передать другую команду?
например, в этой строке:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Я бы хотел, чтобы grep соответствовал содержимому как в stdout, так и в stderr (эффективно, чтобы они объединялись в один поток.)
Примечание: этот вопрос задается о piping, не перенаправление-так что это не дубликат вопроса, который в настоящее время помечен как дубликат.
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