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

发布于 2024-11-02 20:36:14 字数 699 浏览 6 评论 0原文

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

我尝试过使用 tee,但是一旦我使用“2>&1”合并了 stderr 和 stdout。由于我的两个管道已合并,我无法再将标准输出打印到屏幕上。

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

。三通-a日志2>&1。 现在我将 stderr 和 stdout 都发送到日志和屏幕。

有什么想法吗?

根据对该网站的一些阅读,有人提出了这个问题。 写入 STDOUT 和 STDOUT STDERR 到日志文件,也将 STDERR 写入屏幕

还有一个非常相似的问题: 同步保存stdout、stderr和stdout+stderr

但是他们都不能将 stdout+stderr 重定向到日志,将 stderr 重定向到屏幕,同时将 stdoud 和 stderr 同步写入日志文件。

This is a task that I try to do pretty often.
I want to log both stderr and stdout to a log file. But I only want to print to console stderr.

I've tried with tee, but once I've merge stderr and stdout using "2>&1". I can not print stdout to the screen anymore since both my pipes are merged.

Here is a simple example of what I tried

./dosomething.sh | tee -a log 2>&1.
Now I have both stderr and stdout to the log and the screen.

Any Ideas?

Based on some reading on this web site, this question has been asked.
Write STDOUT & STDERR to a logfile, also write STDERR to screen

And also a question very similar here:
Save stdout, stderr and stdout+stderr synchronously

But neither of them are able to redirect both stdout+stderr to a log and stderr to the screen while stdoud and stderr are synchronously written to the log file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

轻许诺言 2024-11-09 20:36:14

我能够在 bash 中正常工作:

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

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

I was able to get this working in bash:

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

This does not work correctly in zsh (the prompt does not wait for the process to exit), and does not work at all in dash. A more portable solution may be to write a simple C program to do it.

[浮城] 2024-11-09 20:36:14

我设法在 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 来生成标准输出。

I managed to get this working with this script in 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

The order of the output is preserved. With this script the process ends correctly.

Note: I used grep and stat without parameter to generate stdout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文