在将文本加载到 Kubernetes secret 时,使用“>>”写入文件与在字符串中使用换行符“\n”有什么区别?

What is the difference of writing to files using ">>" vs using linefeed character "\n" in a string when loading text to Kubernetes secret?

我观察到 kubectl 在使用 --from-literal 选项时会插入一个额外的 \ 来换行字符。从文件加载“相同”内容时,它按预期工作。显然,一定有区别,因为标准输出看起来不同,但我不明白为什么。

echo "api_key" >> .tmp
echo "api_value" >> .tmp
cat -e .tmp
kubectl delete secrets api-env
kubectl create secret generic api-env --from-file=.api=.tmp
rm .tmp
kubectl get secret api-env -o json | jq '.data | map_values(@base64d)'

#prints:
#api_key$
#api_value$
#secret "api-env" deleted
#secret/api-env created
#{
#  ".api": "api_key\napi_value\n"
#}

上面的命令在每一行创建一个换行符。 cat -e 演示文件中有两个换行符,每个都在末尾。

使用字符串执行相同操作会导致 \n 被转义。

api="api_key\napi_value\n"
echo $api
kubectl delete secrets api-env
kubectl create secret generic api-env --from-literal=.api=$api
kubectl get secret api-env -o json | jq '.data | map_values(@base64d)'

#prints:
#api_key\napi_value\n
#secret "api-env" deleted
#secret/api-env created
#{
#  ".api": "api_key\napi_value\n"
#}

echo 命令显示提供给变量的字符串,但是在将其加载到 kubernetes 之后,\n 被转义并且内容被视为单行。

这很重要,因为在我使用 kubectl 的几个实例中,我不允许写入本地文件系统。

这里发生了什么以及如何阻止 kubernetes 转义 \n 字符?

环境:

当您使用 echo $api 时,echo 本身会更改内容:在 POSIX-compliant shell 启用 XSI 扩展(而 zsh 未启用 POSIX-compliant 一般来说,它 确实 实现了这个方面),\n 被替换为文字换行符。

不会发生在--from-literal=.api=$api;在那里,你的 \n 仍然是 two-character 序列,首先是反斜杠,然后是 n.

鉴于您使用的 shell 支持使用 $'\n' 作为直接表示换行文字的方式,请考虑 --from-literal=.api="api_key"$'\n'"api_value"