【发布时间】:2020-09-04 09:12:42
【问题描述】:
假设您有一个 bash 脚本,并且您想要打印并将输出(stderr 和 stdout)保存到日志文件中。基于这个答案:@cdarke 的https://stackoverflow.com/a/49514467/835098,这就是你可以做到的。
#!/bin/bash
exec > >(tee my.log) 2>&1
echo "Hello"
但是,如果您有一个脚本,其中不同的部分需要转到不同的日志文件,该怎么办?假设您想将典型的configure、make、make test 输出分别放入各自的日志文件中?一种天真的方法可能看起来像这样(为了简单起见,configure 和类似的在这里变成了echos):
#!/bin/bash
# clear logs
rm -f configure.log make.log make_test.log
exec > >(tee configure.log) 2>&1
echo "configure"
exec > >(tee make.log) 2>&1
echo "make"
exec > >(tee make_test.log) 2>&1
echo "make test"
但是当你执行这个脚本时,你会注意到只有最后一个输出包含它应该包含的内容:
$ tail *.log
==> configure.log <==
configure
make
make test
==> make.log <==
make
make test
==> make_test.log <==
make test
还要注意每个日志文件都以正确的输出开头。我考虑过坚持使用一个日志文件,并在将其中的一个中间部分复制到最终目的地后截断它。这个脚本有效,但我想知道它是否有任何好处:
#!/bin/bash
# clear logs
rm -f configure.log make.log make_test.log tmp.log
exec > >(tee tmp.log) 2>&1
echo "configure"
cp tmp.log configure.log && truncate -s 0 tmp.log
echo "make"
cp tmp.log make.log && truncate -s 0 tmp.log
echo "make test"
cp tmp.log make_test.log && truncate -s 0 tmp.log
以下是生成的日志文件:
$ tail *.log
==> configure.log <==
configure
==> make.log <==
make
==> make_test.log <==
make test
==> tmp.log <==
例如,这种方法的一个缺点是,如果命令成功,最终的日志文件将可用。实际上,这很糟糕,也是寻找其他解决方案的好理由。
【问题讨论】:
标签: bash exec file-descriptor