我的构建/部署脚本的行为与我预期的不一样。如果克隆或构建失败,它仍然会继续并调用重新启动。我怀疑它是因为我返回 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
Run Code Online (Sandbox Code Playgroud)
ter*_*don 13
是的,正如您所指出的,由于您的函数总是返回 a0
它总是会返回成功。无论发生了什么。最简单的解决方案是让您的函数根本不返回任何内容:
function clone {
git clone /volume1/repos/project.git
cd project
}
function build {
docker build -t project .
}
Run Code Online (Sandbox Code Playgroud)
然后,它将返回上次运行命令的退出状态(来自man bash
):
执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。
当然,由于您的clone
函数的最后一个命令是cd
,这意味着如果git clone
失败但cd project
成功,您的函数仍然会返回成功。为了避免这种情况,您可以将 git 命令的退出状态保存在一个变量中,然后让您的函数返回该变量:
function clone {
git clone /volume1/repos/project.git
out=$?
cd project
return $out
}
Run Code Online (Sandbox Code Playgroud)
或者,也许更好:
function clone {
git clone /volume1/repos/project.git && cd project
}
Run Code Online (Sandbox Code Playgroud)
通过组合命令,如果其中一个失败,您的函数将返回失败。