Bash 重定向同步的困境
Bash redirecting synchronization dilemma
为了自动执行某些系统更新功能,我编写了一些 BASH 脚本。
我想要实现的是将 stdout 和 stderr 重定向到日志文件,并将 stderr 重定向到终端 运行 脚本。
这是我到目前为止的想法:
((./cmd >logfile) 2>&1) | tee logfile
注意 ./cmd 在这里是一个占位符,在我的脚本中它实际上是对我的一台机器的 ssh 调用。
不幸的是,从两个不同的进程写入同一个文件并不理想。我的 update.log 显然显示了两个写入相互踩踏的迹象。
我希望日志交错,以便抛出的错误接近相关的标准输出,因此写入单独的文件并在之后合并它们并不是一个真正的选择。
如有任何建议,我们将不胜感激。
让 tee 将其标准输入复制到控制终端,将 ./cmd
的标准错误通过管道传输到 tee's stdin, and redirect both programs' stdout 到连接到 logfile 的文件描述符。 tee 不缓冲其输出,因此请确保 ./cmd
也不缓冲,并希望最好。
{ stdbuf -o 0 ./cmd 2>&1 >&3 | tee /dev/tty >&3; } 3>logfile
为了自动执行某些系统更新功能,我编写了一些 BASH 脚本。
我想要实现的是将 stdout 和 stderr 重定向到日志文件,并将 stderr 重定向到终端 运行 脚本。
这是我到目前为止的想法:
((./cmd >logfile) 2>&1) | tee logfile
注意 ./cmd 在这里是一个占位符,在我的脚本中它实际上是对我的一台机器的 ssh 调用。
不幸的是,从两个不同的进程写入同一个文件并不理想。我的 update.log 显然显示了两个写入相互踩踏的迹象。 我希望日志交错,以便抛出的错误接近相关的标准输出,因此写入单独的文件并在之后合并它们并不是一个真正的选择。
如有任何建议,我们将不胜感激。
让 tee 将其标准输入复制到控制终端,将 ./cmd
的标准错误通过管道传输到 tee's stdin, and redirect both programs' stdout 到连接到 logfile 的文件描述符。 tee 不缓冲其输出,因此请确保 ./cmd
也不缓冲,并希望最好。
{ stdbuf -o 0 ./cmd 2>&1 >&3 | tee /dev/tty >&3; } 3>logfile