gpt4 book ai didi

bash - 需要对 kubectl stdin 和 pipeline 进行一些解释

转载 作者:行者123 更新时间:2023-12-03 02:50:36 25 4
gpt4 key购买 nike

我是 kubectl 的日常用户,但不是 Linux 专家。最近部署后需要编辑一些服务类型,所以搜索并使用了 kubectl replace而且效果很好。

cat yaml | kubectl replace -f -

service/tracs-pool-1sv replaced

但我不明白为什么要在最后添加短破折号 -。医生只说:

Replace a pod based on the JSON passed into stdin.

我搜索发现this所以问题,并且学习的 kubectl 命令可能是那种不读取 stdin 的命令(我对吗?)。

我试过了

cat yaml |xargs kubectl replace -f

但返回错误:

the path "apiVersion:" does not exist

那么结尾的短破折号(-)语法是为 kubectl ONLY 构建的吗?或者是 linux bash stdin 管道的一些更常见的语法?有人可以解释为什么 xargs 在这里不起作用并且我必须在末尾放置一个短破折号(-)吗?

最佳答案

这是一个相当常见但不通用的 Un*x 约定。 (POSIX 规范中提到了它,因此大多数非 Linux Unices 也将支持它。)

这里的重要细节是 kubectl ... -f 选项需要一个文件名。如果您有一个名为 x.yaml 的文件,则编写所显示内容的更直接方法是

kubectl replace -f x.yaml

你所说的-f -,表面上意味着“一个名为-的文件”,但是kubectl(以及许多其他工具)实际上将其解释为“进程的标准输入”。例如,您可以将其用于非常轻量级的模板系统,例如

sed 's/TAG/1.2.3-20190103/g' x.yaml | kubectl replace -f -

对于一般的 Un*x 工具,POSIX.1 states对于许多命令来说,

...an operand naming a file can be specified as '-', which means to use the standard input instead of a named file....

支持此功能的一些命令包括 cat , grep , sort和 tar(POSIX 不需要)。例如,在两台 Linux 计算机之间移动目录树的一种方法是在 stdout 上创建一个 tar 文件,通过 ssh 将该流传输到远程计算机,然后从 stdin 解压 tar 文件:

tar cf - . | ssh elsewhere tar xf - -C /other/dir

xargs是一个将标准输入上的文件名列表转换(最常见)为命令行参数的工具。例如,find(1) 可以将匹配文件名的列表打印到其标准输出,因此您可以构建一个管道来删除 shell 备份文件,例如

find . -name '*~' | xargs rm

您通常不会将其与 Kubernetes 一起使用;例如,您的示例尝试将 YAML 内容本身作为命令行参数传递给 kubectl。您可以在目录树中应用 kubectl ,例如

find . name '*.yaml' | xargs -n1 kubectl apply -f

但是由于 kubectl ... -f 支持目录名称(不是通用约定),您可以更直接地执行相同的操作

kubectl apply -f . # where . is the current directory

关于bash - 需要对 kubectl stdin 和 pipeline 进行一些解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54032336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com