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

如何从嵌套的 shell 脚本中抛出错误并使父 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 "${RED}Error: All values should be true for sdk build in env.ts file${reset}"
  exit 1
fi

echo "${green}Build 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

更多代码

【问题讨论】:

    标签: macos shell unix


    【解决方案1】:

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

    #!/bin/bash -e
    

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

    ./a.sh || true
    

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

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

    【讨论】:

    • 非常感谢您的回答。所以在我的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 执行。
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 2013-05-10
    • 2018-07-15
    • 2019-05-20
    • 2019-06-10
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多