首页 文章

如何同步记录stderr和stdout,但只将stderr打印到屏幕?

提问于
浏览
2

这是我经常尝试做的任务 . 我想将stderr和stdout都记录到日志文件中 . 但我只想打印到控制台stderr .

我试过tee,但是一旦我使用“2>&1”合并了stderr和stdout . 我不能再将stdout打印到屏幕上,因为我的两个管道都已合并 .

这是我尝试过的一个简单例子

./dosomething.sh | tee -a log 2>&1 . 现在我有stderr和stdout到日志和屏幕 .

有任何想法吗?

基于对本网站的一些阅读,已经提出了这个问题 . Write STDOUT & STDERR to a logfile, also write STDERR to screen

还有一个非常相似的问题:Save stdout, stderr and stdout+stderr synchronously

但是当stdoud和stderr同步写入日志文件时,它们都无法将stdout stderr重定向到日志和stderr到屏幕 .

2 回答

  • 1

    我能够在bash中使用它:

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

    这在zsh中无法正常工作(提示不等待进程退出),并且在dash中根本不起作用 . 更便携的解决方案可能是编写一个简单的C程序来完成它 .

  • 5

    我设法在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 without parameter来生成stdout .

相关问题