bash 命令:
$(System.DefaultWorkingDirectory)/yq_linux_amd64 '. *= load("${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml")' ${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml > $(System.DefaultWorkingDirectory)/deployment-values.yaml
正在合并两个 YAML 文件中的值,并将合并后的输出发送到单个文件。我无法理解从第一个单引号到输出重定向的语法。有人能帮我理解一下这是什么意思吗?
为什么两个操作数都在运算符后面,也就是*=
?.
是当前目录,但是 ? 之前是什么意思呢*=
?
另外,为什么只有第一个操作数介于之间load ()
,其含义是什么?
Mike Farah 的
yq
YAML 处理器与著名的 JSON 处理器具有类似的表达式语法。它的表达式是过滤器(不过,在本例中,这一点并不重要)。jq
在表达式中
...此表达式中的初始点代表“此时的当前文档”,在给定的命令中它将是
yq
从其输入中读取的任何文档,即文件${{ parameters.HELM_CHART_PATH }}/values/global-values.yaml
。该运算符
*=
将右侧的文档合并到左侧的文档中,即输入文档,其中包含表达式load("file")
生成的任何内容。load()
在您问题中的表达式中,该函数将从 加载文档${{ parameters.HELM_CHART_PATH }}/values/DEV/${{ parameters.COMPONENT }}.yaml
。整个操作是以下命令的具体实例,可以在手册中的合并两个文件部分找到
yq
:有关各种合并操作的更多示例,请参阅父部分乘法(合并)。
使用Andrey Kislyuk 的,它是
yq
处理器jq
的包装器(因此完全共享其表达式语法),类似的命令看起来像...再次强调,这里的点代表“此时的当前文档”,并
input
从输入中读取下一个对象,如果两个文件包含一个顶级文档,那么就. *= load("file2")
与 Mike Farah 的完全一样yq
。该
-y
选项用于生成 YAML 输出,或者我们将得到一个 JSON 文档。这不是 Bash 的问题。我把答案贴在这里,方便以后大家参考。
注意:请注意,下面例子中的“命令”只是为了理解,与问题中的“命令”无关。
YAML 文件的合并是使用名为 YQ 的工具完成的(参考:https ://mikefarah.gitbook.io/yq/operators/multiply-merge )
我也在这里找到了解释。
解释:
高层次上,这通过将路径键从 file1 减少到 file2 来实现,其中每个路径我们要么使用 file2(如果存在),否则使用 file1。