如何在命令失败时重定向输出并退出?

如何在命令失败时重定向输出并退出?

这是我在脚本(通常是 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命令怎么样?除非您下定决心自己编写解决方案,否则这将是一个技巧。

相关内容