首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在脚本本身中重定向整个shell脚本的输出?

如何在脚本本身中重定向整个shell脚本的输出?
EN

Stack Overflow用户
提问于 2008-11-24 16:28:21
回答 4查看 208.4K关注 0票数 247

有没有可能将Bourne shell脚本的所有输出重定向到某个地方,但脚本本身包含shell命令?

重定向单个命令的输出很简单,但我想要更多这样的输出:

代码语言:javascript
复制
#!/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,这是这样完成的:

代码语言:javascript
复制
# 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
EN

回答 4

Stack Overflow用户

发布于 2008-11-24 16:29:53

通常我们会将其中一个放在脚本的顶部或靠近脚本的顶部。解析其命令行的脚本将在解析后执行重定向。

将stdout发送到文件

代码语言:javascript
复制
exec > file

使用stderr

代码语言:javascript
复制
exec > file                                                                      
exec 2>&1

将stdout和stderr都追加到文件

代码语言:javascript
复制
exec >> file
exec 2>&1

作为Jonathan Leffler mentioned in his comment

exec有两个独立的工作。第一种方法是用新程序替换当前正在执行的shell (脚本)。另一个是更改当前shell中的I/O重定向。这一点的区别在于没有exec参数。

票数 214
EN

Stack Overflow用户

发布于 2008-11-24 16:44:55

您可以使整个脚本成为如下所示的函数:

代码语言:javascript
复制
main_function() {
  do_things_here
}

然后,在脚本的末尾添加以下内容:

代码语言:javascript
复制
if [ -z $TERM ]; then
  # if not run via terminal, log everything into a log file
  main_function 2>&1 >> /var/log/my_uber_script.log
else
  # run via terminal, only output to screen
  main_function
fi

或者,您可以在每次运行时将所有内容都记录到日志文件中,然后通过简单的操作将其输出到stdout:

代码语言:javascript
复制
# log everything, but also output to stdout
main_function 2>&1 | tee -a /var/log/my_uber_script.log
票数 40
EN

Stack Overflow用户

发布于 2015-04-16 04:46:25

要保存原始stdout和stderr,您可以使用:

代码语言:javascript
复制
exec [fd number]<&1 
exec [fd number]<&2

例如,以下代码将把"walla1“和"walla2”输出到日志文件(a.txt),将"walla3“输出到stdout,将"walla4”输出到stderr。

代码语言:javascript
复制
#!/bin/bash

exec 5<&1
exec 6<&2

exec 1> ~/a.txt 2>&1

echo "walla1"
echo "walla2" >&2
echo "walla3" >&5
echo "walla4" >&6
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/314675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档