![如何在命令失败时重定向输出并退出?](https://linux22.com/image/1344871/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%91%BD%E4%BB%A4%E5%A4%B1%E8%B4%A5%E6%97%B6%E9%87%8D%E5%AE%9A%E5%90%91%E8%BE%93%E5%87%BA%E5%B9%B6%E9%80%80%E5%87%BA%EF%BC%9F.png)
这是我在脚本(通常是 cronjobs)中记录 stdout 和 stderr 的方式:
#!/bin/bash
mylog() {
echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1"
}
(
mylog 'start'
some-command || mylog 'error' && exit 1
mylog 'end'
) >> /var/log/my-log.log 2>&1
在某些脚本中,我使用 return 代替 exit,效果很好,但现在它说我不能使用 return,除非我将脚本包含在 src 中或在函数中使用它。所以我将它改为 exit,但问题是它没有记录任何内容,似乎它停止了 >> 输出重定向。另一个问题是我以后无法将它包含在 src 中,因为我只想停止这个脚本,而不是所有脚本。
我使用输出重定向是因为我想记录所有内容,即使没有发生错误。有时命令甚至不会返回正确的退出代码,所以我不能相信这一点。
那么我如何在发生错误时“返回”?我知道“set -e”,但我更喜欢更好地控制何时停止脚本。
有什么想法吗?
答案1
我无法解释您所遇到的行为,但这是一个可能的解决方法:
/bin/bash #!/bin/bash 我的日志(){ 回显“[$(日期'+ %Y-%m-%d %H:%M:%S')] $1” } 我的主要(){ ( mylog‘开始’ some-command || mylog'错误'&&返回1 mylog‘结束’ )>> /var/log/my-log.log 2>&1 } 我的主要
或者,从函数定义中删除重定向mymain
并将其放在mymain
函数调用中:
mymain >> /var/log/my-log.log 2>&1
(那么你也可以从mymain
函数定义中删除括号。)或者,由于你希望将 IO 重定向到全部的脚本,你可以将重定向与操作语句分开:
执行>> /var/log/my-log.log 执行 2>&1 我的主要
由于我不明白您的方法为何会失败,因此我无法解释为什么上述任何一种方法更有可能按预期工作。但是,它们是做同一件事的略有不同的方法,这可能就足够了。顺便说一句,我改成`date …`
只是$(date …)
出于一般原因;我不认为这与你的问题有任何关系。
答案2
在 Linux 中使用该screen
命令怎么样?除非您下定决心自己编写解决方案,否则这将是一个技巧。