我有一个名为vm.sh的bash脚本,它将调用vm-template.json文件,该文件包含类型Microsoft.Compute/virtualMachines/extensions
,并从该模板中使用调用了另一个bash(main.sh)脚本。 commandToExecute ,main.sh文件将调用另一个sh文件(sub.sh),然后从那里我返回退出代码为1,但是它没有反映在vm.sh中,后者将退出代码返回为0 >
vm.sh
az group deployment create --name "$DEPLOYMENT_NAME" --template-file "$TEMPLATE_FILE_PATH"
template.json
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "[concat(parameters('vmName'),'/test')]",
"apiVersion": "[variables('computeApiVersion')]",
"location": "[variables('location')]",
"dependsOn": [
"[resourceId('Microsoft.Resources/deployments', variables('vmTemplateName'))]"
],
"properties": {
"publisher": "Microsoft.Azure.Extensions",
"type": "CustomScript",
"typeHandlerVersion": "2.0",
"autoUpgradeMinorVersion": true,
"forceUpdateTag": "v.1.0",
"settings": {
"fileUris": ["[parameters('initScriptURL')]"]
},
"protectedSettings":{
"commandToExecute": "[concat('bash main.sh', ' ', parameters('name'))]"
}
}
}
sub.sh
type -p <package>
subScriptExitCode="$?"
if [ "$subScriptExitCode" -ne 0 ]; then
return 1
fi
main.sh
source "sub.sh"
subScriptExitCode=$?
log "subScript ExitCode: $subScriptExitCode"
if [ $subScriptExitCode -ne 0 ]; then
exit $subScriptExitCode
fi
答案 0 :(得分:0)
我认为您正在寻找shell选项set -e
在脚本的开头设置$?
会导致它们在任何命令以非零状态退出时立即退出,而不是显式地对set -e
进行所有检查。
对于您的每个.sh
文件,只需在任何其他命令之前(在#!/usr/bin/env bash
(或类似的shebang)之后)添加以下行:
#!/usr/bin/env bash
set -e
...
如果要记录日志,可以使用trap
s进行记录。例如:
(只需删除sub.sh
,然后编辑main.sh
如下:
#!/usr/bin/env bash
set -e
onError() {
log "command check exit code: $1"
}
trap 'onError $?' ERR
command -v <package>
NB: command -v
比type -p
更具移植性