我的构建/部署脚本的行为不符合我的预期。如果克隆或构建失败,它仍然会继续并调用重新启动。我怀疑它是因为我返回 0,但是如果我想从内部命令返回结果,我应该如何编写,并且在“克隆”中,仅当克隆成功时我才想移动到克隆文件夹中。您将如何改进这个脚本?
function clone {
git clone /volume1/repos/project.git
cd project
return 0
}
function build {
docker build -t project .
return 0
}
function cleanup {
...
}
function restart {
...
docker run ...
}
trap cleanup EXIT
if clone && build; then
restart
exit 0
else
echo Failed...
exit 1
fi
答案1
是的,正如您所指出的,由于您的函数始终返回 a ,因此0
它始终会返回成功。不管发生什么。最简单的解决方案是让您的函数根本不返回任何内容:
function clone {
git clone /volume1/repos/project.git
cd project
}
function build {
docker build -t project .
}
然后,它将返回最后运行命令的退出状态(来自man bash
):
当执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。
当然,由于clone
函数的最后一个命令是cd
,这意味着如果git clone
失败但cd project
成功,您的函数仍将返回成功。为了避免这种情况,您可以将 git 命令的退出状态保存在一个变量中,然后让您的函数返回该变量:
function clone {
git clone /volume1/repos/project.git
out=$?
cd project
return $out
}
或者,也许更好:
function clone {
git clone /volume1/repos/project.git && cd project
}
通过组合命令,如果其中任何一个失败,您的函数将返回失败。
答案2
将您的函数修改为:
function clone {
if git clone /volume1/repos/project.git; then
cd project
return 0
else
return 1
fi
}
function build {
docker build -t project .
}
这样,如果其中的命令失败,该函数将正确退出。请注意,您不需要显式返回该build
函数的任何内容,因为它只会返回 docker 命令的退出状态,但是如果您向其中添加更多命令,您可能需要对其进行类似于该函数的设置clone
。