Bash 读取失败,设置为-eou pipefail
我有这样的剧本Bash 读取失败,设置为-eou pipefail,bash,Bash,我有这样的剧本 #!/bin/bash # exit when any command fails set -euo pipefail api_key="${POWERDNS_API_KEY}" dns_server_addr="127.0.0.1" server_id="localhost" zone_id="${K8S_FQDN_SUFFIX}." prefix="$1" ip="$2" read -rd '' payload << EOF { "rrsets":
#!/bin/bash
# exit when any command fails
set -euo pipefail
api_key="${POWERDNS_API_KEY}"
dns_server_addr="127.0.0.1"
server_id="localhost"
zone_id="${K8S_FQDN_SUFFIX}."
prefix="$1"
ip="$2"
read -rd '' payload << EOF
{
"rrsets": [
{
"name": "$prefix.svc.${K8S_FQDN_SUFFIX}.",
"type": "A",
"changetype": "REPLACE",
"ttl": 10,
"records": [
{
"content": "$ip",
"disabled": false
}
]
}
]
}
EOF
curl -i -H "X-API-Key: $api_key" -X PATCH --data "$payload" \
"http://$dns_server_addr:8081/api/v1/servers/$server_id/zones/$zone_id"
#/bin/bash
#当任何命令失败时退出
设置-euo管道故障
api_key=“${POWERDNS_api_key}”
dns_server_addr=“127.0.0.1”
server\u id=“localhost”
zone_id=“${K8S_FQDN_后缀}”
前缀=“$1”
ip=“$2”
read-rd''有效负载命令尝试从标准输入读取一行。如果由于任何原因失败(包括在看到行终止符之前点击文件末尾),它将以非零状态退出。在您的例子中,-d'
选项告诉read
查找ASCII空字符作为行终止符,并且由于here文档没有一个空字符,所以它会一直读取,直到它到达EOF。。。然后以错误状态退出
read
的行为在这里可能有点违反直觉。它成功地读取了一些内容,并将变量(payload
)设置得很好;但是由于它达到了EOF,POSIX标准要求它返回一个错误。当逐行读取文本文件时,会发生完全相同的情况
正常情况下,这不会有什么大不了的,但是-e
选项set
使shell在任何简单命令以非零(错误)状态退出(与此处无关)时退出。当read
执行此操作时,脚本将立即退出
因此,有一些可能的解决方案。您可以不使用set-e
,您可以将set+e
放在read
命令的前面(之后可能会再次使用set-e
),或者您可以使其成为一个成功的复合命令,如下所示:
read -rd '' payload << EOF || true
...
read-rd''负载确实读取了Gordon答案中的“大量混乱异常”链接set-e
似乎是个好主意。。。直到你深入了解它的工作原理。很好的答案。谢谢。