【发布时间】:2010-09-23 19:14:10
【问题描述】:
是否可以将 Bourne shell 脚本的所有输出重定向到某个地方,但脚本本身包含 shell 命令?
重定向单个命令的输出很容易,但我想要更像这样的东西:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
含义:如果脚本以非交互方式运行(例如,cron),则将所有内容的输出保存到文件中。如果从 shell 以交互方式运行,让输出像往常一样转到标准输出。
我想为通常由 FreeBSD 定期实用程序运行的脚本执行此操作。这是日常运行的一部分,我通常不关心每天在电子邮件中看到它,所以我没有发送它。但是,如果这个特定脚本中的某些东西失败了,那对我来说很重要,我希望能够捕获并通过电子邮件发送日常工作的这一部分的输出。
更新:Joshua 的回答很准确,但我还想围绕整个脚本保存和恢复 stdout 和 stderr,方法如下:
# save stdout and stderr to file
# descriptors 3 and 4,
# then redirect them to "foo"
exec 3>&1 4>&2 >foo 2>&1
# ...
# restore stdout and stderr
exec 1>&3 2>&4
【问题讨论】:
-
测试 $TERM 并不是测试交互模式的最佳方法。相反,测试 stdin 是否为 tty (test -t 0)。
-
换句话说:如果 [ ! -t 0 ];然后执行 >somefile 2>&1;菲
-
看到这里所有的好处:http://tldp.org/LDP/abs/html/io-redirection.html 基本上是约书亚所说的。 exec > file 将标准输出重定向到特定文件,exec
-
在您的更新部分,您还应该关闭 FD 3 和 4,如下所示:
exec 1>&3 2>&4 3>&- 4>&- -
Permission denied在第一行exec上。