Передача stderr в файл и на экран без перенаправления stderr в stdout

479
Eddy

В скрипте bash я хотел бы выполнить команду при передаче stderr как в файл, так и в терминал. Однако я хочу, чтобы stderr оставался в файловом дескрипторе '2', чтобы я мог проанализировать его из внешнего процесса, который вызывает этот сценарий bash.

Все решения, которые я видел до сих пор, включают замену stdout на stderr, а затем переход к другому файлу, например :

find /var/log 3>&1 1>&2 2>&3 | foo.file 

Если мне нужно вызвать этот скрипт из другого, stderr перейдет в stdout, а stdout перейдет в stderr, что мне не подходит. Я попытался поменять их снова так:

find /var/log 3>&1 1>&2 2>&3 | foo.file 4>&1 1>&2 2>&4 

но это не работает

0

1 ответ на вопрос

1
Eddy

В конце я узнал, как это сделать, следуя советам с этой страницы . Мне нужно перенаправить stderr, чтобы teeзатем перенаправить вывод teeобратно в stderr.

find /var/log 2> >(tee foo.file >&2) 
Должно работать, но я ожидаю, что stdout и stderr из `find` будут иногда десинхронизироваться в терминале. Это связано с `tee`, буферами и т. Д. Если` find` записывает stdout и stderr напрямую на одно устройство, проблема никогда не возникает; но если два потока объединены * позже *, это возможно. Kamil Maciorowski 6 лет назад 0

Похожие вопросы