我对 xargs 还很陌生
我有一个命令
kubectl taint nodes xx.xx.xx.xx dedicated=test:NoSchedule --overwrite=true
我有我的命令,如何将位置值传递给 xargs?他们没有被通过。
echo \$NODES \$key_and_value \$overwrite \$label |
xargs -I -l % sh -c 'kubectl taint nodes \$0 % \$1 --overwrite=\$2'
基本上我正在做这样的事情,我从 jenkins ui 获取这些值这些值是动态的
echo \$NODES \$key_and_value \$overwrite |
xargs -I% bash -c 'kubectl --kubeconfig ./kube-configs/config \
taint nodes % "\$0" "\$1" --overwrite=% "\$2"'`
错误 :
16:06:42 Error: invalid argument "ip-xx-xx-xx-xx.ec2.internal" for "--overwrite" flag: strconv.ParseBool: parsing "ip-xx-xx-xx-xx.ec2.internal": invalid syntax
答案1
您必须在命令字符串之外定义位置参数:
echo a b c d | xargs -I VALUES sh -c "echo \$4 \$3 \$2 \$1" command VALUES
这没有得到很好的描述(在我的例子中man dash
)
-C
从 command_string 操作数而不是从标准输入读取命令。特殊参数 0 将从 command_name 操作数设置,位置参数($1、$2 等)从剩余参数操作数。
但行为就像更好地解释man bash
:
-C
如果存在 -c 选项,则从第一个非选项参数 command_string 读取命令。如果有command_string 之后的参数,第一个参数被分配给 $0 和任何剩余的参数被分配给位置参数。对 $0 的赋值设置了 shell 的名称,该名称用于警告和错误消息。
请注意,command_string 设置为引号 (= $0
)中的命令字符串之后的第一个参数
在您的情况下,您使用了-I
不带参数的选项,这意味着xargs
读取的值不仅是附加的,而且需要通过调用'{}'
。所以要么使用这个:
echo 1 2 3 4 | xargs sh -c "echo \$4 \$3 \$2 \$1" command
或这个
echo 1 2 3 4 | xargs -I sh -c "echo \$4 \$3 \$2 \$1" command '{}'
提示:使用-x
选项 fromsh
和-t
选项 fromxargs
可以更好地跟踪奇怪的行为。他们将在执行之前打印每个命令行。