Bash 重定向同步困境

标签 bash stdout stderr

为了自动化某些系统更新功能,我编写了一些 BASH 脚本。

我想要实现的是将 stdout 和 stderr 重定向到日志文件,并将 stderr 重定向到运行脚本的终端。

这是我到目前为止所想出的: ((./cmd >日志文件) 2>&1) | tee日志文件

注意 ./cmd 是这里的占位符,在我的脚本中它实际上是对我的一台机器的 ssh 调用。

不幸的是,从两个不同的进程写入同一个文件并不理想。我的 update.log 明显显示了两个写入互相踩踏的迹象。 我希望日志交错,以便抛出的错误接近相关的标准输出,因此写入单独的文件并随后合并它们并不是真正的选择。

如有任何建议,我们将不胜感激。

最佳答案

tee将其标准输入复制到控制终端,将./cmd的stderr通过管道传输到tee的标准输入,然后重定向两者程序的标准输出到连接到日志文件的文件描述符。 tee 不会缓冲其输出,因此请确保 ./cmd 也不缓冲其输出,并祝愿最好的结果。

{ stdbuf -o 0 ./cmd 2>&1 >&3 | tee /dev/tty >&3; } 3>logfile

关于Bash 重定向同步困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65524888/

相关文章:

mysql - 从配置文件将变量导入 bash 脚本

python - 在 Python 中读取另一个程序的控制台输出

python - "subprocess.Popen"- 检查成功和错误

bash - 如何在状态栏中显示 tmux 环境变量(作为窗口格式)

bash - -bash : syntax error near unexpected token `(' while git checkout

Bash glob 扩展,如 echo $pathInVar*

shell - 如何将缓冲区内容写入标准输出?

Python popen() 在要求时插入密码

bash - stdout 到 file1,stderr 到 file2,都正确交错到 stdout 和文件

cmd - 编程时如何缩短控制台上显示的错误代码