【发布时间】:2010-05-20 05:30:58
【问题描述】:
我想运行几个命令,并将所有输出捕获到一个日志文件中。我还想将任何错误打印到屏幕上(或者选择将输出邮寄给某人)。
这是一个例子。以下命令将运行三个命令,并将所有输出(STDOUT 和 STDERR)写入单个日志文件。
{ command1 && command2 && command3 ; } > logfile.log 2>&1
这是我想要对这些命令的输出执行的操作:
- 所有命令的 STDERR 和 STDOUT 都保存在一个日志文件中,以防我以后需要它——除非有问题,否则我通常不会在这里查看。
- 将 STDERR 打印到屏幕上(或可选地,通过管道打印到 /bin/mail),这样任何错误都不会被忽略。
-
如果返回码仍然可用,那就太好了,这样我就可以进行一些错误处理。如果出现错误,也许我想发送电子邮件,如下所示:
{ 命令1 && 命令2 && 命令3 ; } > 日志文件.log 2>&1 || mailx -s "出现错误" stefanl@example.org
我遇到的问题是 STDERR 在 I/O 重定向期间丢失了上下文。 '2>&1' 会将 STDERR 转换为 STDOUT,因此如果我这样做,我将无法查看错误 2> error.log
这里有几个更有趣的例子。假设我正在运行一些熟悉的构建命令,但我不希望整个构建仅仅因为一个错误而停止,所以我使用了“--keep-going”标志。
{ ./configure && make --keep-going && make install ; } > build.log 2>&1
或者,这是一个简单的(可能是草率的)构建和部署脚本,它会在发生错误时继续运行。
{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1
我想我想要的是某种Bash I/O Redirection,但我想不通。
【问题讨论】: