Предположим, у меня есть код, и он работает в очень подробном режиме. Эта максимальная подробность выдает сообщение, которое я хотел бы прочитать, чтобы узнать, как все работает. Однако терминал переполнен другим контентом.
Есть ли способ отфильтровать вывод stderror с помощью grep без перехода с конвейера stderror на конвейер stdout?
например,
my-command 2>&1 | grep something # ok, great; is it possible without the pipe shift?
Это возможно?
i.e., maybe
my-command 2>(grep something)?
решение1
Я помещаю эти два варианта в качестве ответов, хотя они на самом деле не отвечают на вопрос (ответ: «в bash — нет»), на случай, если кто-то еще это увидит, а также чтобы показать метод замены stdout и stderr, а также для правильного форматирования (в отличие от комментариев).
Ответ один: предположим, что это программа, которую вы хотите запустить (я знаю, что это не похоже на команду, но представьте, что это так; заменитевсеэтого с командой и аргументами, которые вы действительно хотите запустить):
{ echo stdout; echo stderr >&2; }
Теперь предположим, что вы хотите выполнить grep только stderr для чего-либо, но оставить stdout как есть.
{ echo stdout; echo stderr >&2; } 2> >(grep something)
Если это таквсевы бы получили весь stdout и части stderr, которые что-то в нем содержат, все вперемешку. Вы можете захотеть записать stdout и stderr в отдельные файлы для последующего просмотра:
{ echo stdout; echo stderr >&2; } 2> >(grep something > errorfile) > outputfile
Для замены stdout и stderr (и почему это может понадобиться) см.https://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderrдля лучшего объяснения, чем я могу дать.