Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 读取失败,设置为-eou pipefail_Bash - Fatal编程技术网

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
似乎是个好主意。。。直到你深入了解它的工作原理。很好的答案。谢谢。