是否有可能重定向一个伯恩shell脚本的所有输出到某个地方,但在脚本本身的shell命令?
重定向单个命令的输出很容易,但我想要的东西更像这样:
#!/bin/sh
if [ ! -t 0 ]; then
# redirect all of my output to a file here
fi
# rest of script...
含义:如果脚本以非交互方式运行(例如,cron),则将所有输出保存到一个文件中。如果从shell以交互方式运行,则像往常一样让输出进入stdout。
我想为通常由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