Как синхронно регистрировать stderr и stdout, но выводить stderr только на экран? - PullRequest
2 голосов
/ 21 апреля 2011

Это задача, которую я стараюсь выполнять довольно часто.Я хочу войти как stderr и stdout в файл журнала.Но я хочу печатать только в консоль stderr.

Я пробовал с tee, но как только я объединю stderr и stdout, используя "2> & 1".Я больше не могу печатать стандартный вывод на экран, так как обе мои трубы объединены.

Вот простой пример того, что я попробовал

. / Dosomething.sh |tee -a log 2> & 1.Теперь у меня есть и stderr, и stdout для журнала и экрана.

Любые идеи?

Основываясь на прочтении этого сайта, этот вопрос был задан. Запись STDOUT & STDERR в файл журнала, а также запись STDERR на экран

А также очень похожий вопрос: Синхронное сохранение stdout, stderr и stdout + stderr

Но ни один из них не может перенаправить как stdout + stderr в журнал, так и stderr на экран, в то время как stdoud и stderr синхронно записываются в файл журнала.

Ответы [ 2 ]

5 голосов
/ 21 апреля 2011

Мне удалось заставить это работать в bash:

(./tmp.sh 2> >(tee >(cat >&2) >&1)) > tmp.log

Это не работает правильно в zsh (приглашение не ожидает завершения процесса) и вообще не работает в dash. Более переносимым решением может быть написание простой программы на Си для этого.

1 голос
/ 21 апреля 2011

Мне удалось заставить это работать с этим скриптом в bash.

mkfifo stdout 
mkfifo stderr 

rm -f out 
cat stderr | tee -a out & 
cat stdout >> out & 
(echo "stdout";  
 grep;  
 echo "an other stdout";  
 echo "again stdout";  
 stat) 2> stderr > stdout 

rm -f stdout 
rm -f stderr

Порядок вывода сохранен.С помощью этого сценария процесс завершается корректно.

Примечание: я использовал grep и stat без параметров для генерации stdout.

...