如何从嵌套的 shell 脚本中抛出错误

Posted

技术标签:

【中文标题】如何从嵌套的 shell 脚本中抛出错误【英文标题】:how to throw error from nested shell script 【发布时间】:2021-10-31 00:55:19 【问题描述】:

并使父 shell 脚本也停止?

我有这个 shell 脚本 (a.sh)

#!/bin/bash
echo "Testing if SDK build config is correct"

FILE="App/env/index.tsx"
CONST_TO_CHECK='[a-zA-Z_]*'
RED=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`

if grep -Eq 'export\s*const\s*'$CONST_TO_CHECK'\s*=\s*false' "$FILE"; then
  echo "$REDError: All values should be true for sdk build in env.ts file$reset"
  exit 1
fi

echo "$greenBuild config seems correct$reset"

我从b.sh 运行。如果a.sh 抛出错误,我也想在 b.sh 中停止进一步执行。

我正在从 a.sh 调用 b.sh。

认为这是我的b.sh

#!/bin/bash
sh ./a.sh

rm -rf ios/ios-sdk/out/Frameworks
xcodebuild clean \
    -workspace ios/dyteClientMobile.xcworkspace \
    -scheme DyteSdk

更多代码

【问题讨论】:

【参考方案1】:

-e 添加到您的#!。 (这在选项中也称为“errexit”。)

#!/bin/bash -e

在这种模式下,任何命令失败(返回非 0 值)都会终止脚本。为了忽略非0返回值,在命令中添加|| true,例如:

./a.sh || true

这将执行a.sh 并继续不管它是否成功。避免在此处添加 sh 前缀。直接执行脚本即可。

有关错误处理 Bash 的更多示例以及更高级的工具(如 ERR 陷阱),请参阅:

Error handling in Bash https://unix.stackexchange.com/questions/97101/how-to-catch-an-error-in-a-linux-bash-script https://linuxhint.com/bash_error_handling/ https://www.redhat.com/sysadmin/bash-error-handling

【讨论】:

非常感谢您的回答。所以在我的b.sh 中,我用#!/bin/bash -e 替换了它,但它仍然继续执行。 复制您的代码并在b.sh 中添加-e 对我来说效果很好。每当它打印“错误:在 env.ts 文件中构建 sdk 的所有值都应该为真”时,它也会停止执行。这是您的实际代码吗?您是以./b.sh 运行b.sh 还是以sh ./b.sh 运行它(在这种情况下,您将禁用-e)。如果你想通过直接调用 sh 或 bash 来运行它,你可以在脚本中使用set -o errexit 而不是-e。这直接设置了值,而不依赖于 shbang 执行。

以上是关于如何从嵌套的 shell 脚本中抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 组嵌套在 VStack 中抛出错误

如何在python中抛出错误并使用自定义消息退出

在 jQuery 中使用 $.ajax 时,如何故意在加载的文档中抛出错误?

如何在扩展中抛出异常?

从服务器方法中抛出 Meteor.Error 会导致脚本退出

如何在 Drupal 模块中抛出 404 错误?