Кажется, что в более новых версиях bash есть &>
оператор, который (если я правильно понимаю) перенаправляет как stdout, так и stderr в файл ( &>>
вместо этого добавляет файл, как пояснил Адриан).
Какой самый простой способ добиться того же, но вместо того, чтобы передать другую команду?
Например, в этой строке:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Я бы хотел, чтобы grep совпадал с контентом как в stdout, так и в stderr (по сути, объединить их в один поток).
Примечание : этот вопрос касается вопросов о трубопроводах, а не о перенаправлении, поэтому он не является дубликатом вопроса, который в настоящее время помечен как дубликат.
|&
ярлык, который, на мой взгляд, является наиболее удобным решением для «перенаправления как stdout, так и stderr в канал».Ответы:
(Обратите внимание, что
&>>file
добавление в файл while&>
приведет к перенаправлению и перезаписи ранее существующего файла.)Чтобы объединить,
stdout
иstderr
вы перенаправили бы последнее на первое использование2>&1
. Это перенаправляет stderr (дескриптор файла 2) в stdout (дескриптор файла 1), например:stdout
идет в стандартный вывод,stderr
идет в стандартный вывод.grep
только видитstdout
, значитstderr
распечатывает на терминал.С другой стороны:
После записи в stdout и stderr
2>&1
перенаправляет stderr обратно в stdout иgrep
видит обе строки в stdin, таким образом отфильтровывая обе.Вы можете прочитать больше о перенаправлении здесь .
Что касается вашего примера (POSIX):
или, используя
>=bash-4
:источник
&>>
. Я исправил свой вопрос.|&
вместо2>&1 |
.|&
ярлыке, предложенном @ AdrianFrühwirth для будущих читателей: эта функция поддерживается только вbash
версии 4+. Если вы используете 3 или ниже, вы должны придерживаться2>&1 |
.У Bash есть сокращение
2>&1 |
, а именно|&
, какие каналы и stdout, и stderr (см. Руководство ):Это было введено в Bash 4.0, см. Примечания к выпуску .
источник