我想运行几个命令,并将所有输出捕获到日志文件.我还想将任何错误打印到屏幕上(或者可选地将输出邮寄给某人).
这是一个例子.以下命令将运行三个命令,并将所有输出(STDOUT和STDERR)写入单个日志文件中.
{ command1 && command2 && command3 ; } > logfile.log 2>&1
Run Code Online (Sandbox Code Playgroud)
这是我想要对这些命令的输出做的事情:
如果返回代码仍然可用,那将是很好的,这样我就可以做一些错误处理.如果出现错误,也许我想发送电子邮件,如下所示:
{command1 && command2 && command3; }> logfile.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
Run Code Online (Sandbox Code Playgroud)
或者,这是一个简单的(也许是草率的)构建和部署脚本,它将在发生错误时继续运行.
{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1
Run Code Online (Sandbox Code Playgroud)
我认为我想要的是某种Bash I/O重定向,但我无法解决这个问题.
R S*_*hko 17
(./doit >> log) 2>&1 | tee -a log
Run Code Online (Sandbox Code Playgroud)
这将采用标准输出并将其附加到日志文件.
然后,标准错误将被转换到标准输出是管道输送到tee其附加到记录(如果你是有击4,可以替换2>&1 |使用|&),并把它发送到stdout将无论是在TTY出现,或者可以通过管道输送到另一个命令.
我使用了append模式,这样无论shell重定向和tee打开文件的顺序如何,你都不会吹掉原来的.也就是说,stderr/stdout可能以意想不到的方式交错.