Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果出现错误,如何退出bash函数?_Bash - Fatal编程技术网

如果出现错误,如何退出bash函数?

如果出现错误,如何退出bash函数?,bash,Bash,我正在做一个预提交脚本。看起来是这样的: function presubmit() { gradle test android gradle test ios gradle test server git push origin master } 如果任何测试失败,我希望函数退出,这样它就不会把bug推到git上。如何操作?通常,当我调用函数并希望在函数失败时显示错误消息时,我会执行以下操作: presubmit | |{echo'presubmit failed';退出1;}

我正在做一个预提交脚本。看起来是这样的:

function presubmit() {
  gradle test android
  gradle test ios
  gradle test server
  git push origin master
}

如果任何测试失败,我希望函数退出,这样它就不会把bug推到git上。如何操作?

通常,当我调用函数并希望在函数失败时显示错误消息时,我会执行以下操作:

presubmit | |{echo'presubmit failed';退出1;}

通过添加
|
标志,它将确定哪个表达式是否为真

希望这有帮助:)

您可以这样做:

# declare a wrapper function for gradle
gradle() {
   command gradle "$@" || exit 1
}

presubmit() {
  gradle test android
  gradle test ios
  gradle test server
  git push origin master
}

declare -xf presubmit gradle
build() {( set -e        # Fail early
  build_cmd_step_1
  build_cmd_step_2
  build_cmd_step_3
  ...
)}
在子shell中调用函数,如下所示:

( presubmit )

我会使脚本更细粒化:

#!/bin/bash

function test() {
  gradle test android
  gradle test ios
  gradle test server
}
function push() {
  git push origin master
}
# this subshell runs similar to try/catch
(
  # this flag will make to exit from current subshell on any error inside test or push
  set -e
  test
  push
)
# you catch errors with this if
if [ $? -ne 0 ]; then
  echo "We have error"
  exit $?
fi

我们只在测试和推送中跟踪错误。您可以在运行测试和推送的子shell之外添加更多操作。您也可以用这种方式为错误添加不同的范围(让我们把它看作是TIG/catch)

< P>我的方法是在函数中的每个命令(除了最后一个命令)之后添加<代码> &和<代码>。
函数预提交(){
gradletestandroid&&\
梯度测试\
gradle测试服务器&&\
git推送源主机
}

1。将subshell
(..)
一起使用;要使其更简洁,可以执行以下操作:

# declare a wrapper function for gradle
gradle() {
   command gradle "$@" || exit 1
}

presubmit() {
  gradle test android
  gradle test ios
  gradle test server
  git push origin master
}

declare -xf presubmit gradle
build() {( set -e        # Fail early
  build_cmd_step_1
  build_cmd_step_2
  build_cmd_step_3
  ...
)}
然后,功能将在第一次失败时失败,您可以拦截退出状态:

build
exit_status=$?
if [ ${exit_status} -ne 0 ]; then
  echo "We have error - build failed!"
  exit "${exit_status}"
fi
2。或者,函数内部的
&&&
链接也很好(),但如果有一个更大的函数,它可能会变得不好


这两种方法都很好,具体取决于您的用例(在某些情况下,使用子shell可能会导致一些不必要的副作用)

您可以查看
gradle…|返回
?每个人都假设在测试失败时,
gradle
将有非零退出。情况可能并非如此。我没有看到文件说gradle会在测试失败时返回非零。应该注意的是,该函数正在调用
gradle
来测试某个操作系统
gradle
本身不会失败,但它执行的测试可能不会通过。OP希望
presubmit
在执行
git push
之前提前退出。这只是显示了如何做一些额外的操作,应该
以非零退出状态预提交
退出。这看起来是最干净的解决方案,因为在~/.中的函数中使用
set-e
。bashrc会导致终端退出。请确保不要将
build
与测试一起运行,因为它将取消激活
set-e
。所以
if!建设;然后…
甚至
如果[build-ne 0];然后..
将无法按预期工作。它也无法作为管道的一部分工作,例如
build | | echo“build failed”
注意,当在函数内部或将要源代码的脚本中使用时,
return“${exit_status}”
通常比
exit“${exit_status}”更合适。