gpt4 book ai didi

bash - 在Bash脚本中捕获被调用命令的所有错误信号

转载 作者:行者123 更新时间:2023-12-03 08:12:50 25 4
gpt4 key购买 nike

我们正在为构建服务器创建bash脚本。我们要确保在脚本内执行bash命令时,它以0信号返回。否则,我们希望停止执行。到目前为止,我们的解决方案是:

#some command
if [ $? -ne 0 ] ; then
#handle error
fi

在每个可能导致此问题的命令之后。这使代码很长,而且看起来不太优雅。也许我们可以使用bash函数。虽然使用$?可能会有些棘手,我们仍然必须在每个命令之后调用该函数。有没有更好的办法?我已经看过 trap 命令,但它似乎只对我正在编写的bash脚本进行信号处理,而不对我调用的任何命令进行信号处理。

最佳答案

健壮,规范的方法是:

#!/bin/bash
die() {
local ret=$?
echo >&2 "$*"
exit "$ret"
}

./configure || die "Project can't be configured"
make || die "Project doesn't build"
make install || die "Installation failed"

脆弱,方便的方法是 set -e:
#!/bin/bash
set -e # Script will exit in many (but not all) cases if a command fails

./configure
make
make install

或等效方式(带有自定义错误消息):
#!/bin/bash
# Will be called for many (but not all) commands that fail
trap 'ret=$?; echo >&2 "Failure on line $LINENO, exiting."; exit $ret' ERR

./configure
make
make install

对于后两个,脚本不会针对条件语句或 &&/ ||的任何命令而退出,因此,在执行以下操作时:
backup() {
set -e
scp backup.tar.gz user@host:/backup
rm backup.tar.gz
}
backup

如果传输失败,将正确避免执行 rm,稍后再插入如下功能:
if backup
then
mail -s "Backup completed successfully" user@example.com
fi

将使 backup在失败时停止退出,并意外删除备份。

关于bash - 在Bash脚本中捕获被调用命令的所有错误信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com