如何从嵌套的 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 脚本中抛出错误的主要内容,如果未能解决你的问题,请参考以下文章
在 jQuery 中使用 $.ajax 时,如何故意在加载的文档中抛出错误?