我想在容器中执行一个命令(让它成为ls(,然后用echo$读取退出代码kubectl exec -ti mypod -- bash -c "ls; echo $?"
不起作用,因为它返回的是我当前shell的退出代码,而不是容器的退出代码。
因此,我尝试在清单中定义的env变量上使用eval:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- container2
image: varunuppal/nonrootsudo
env:
- name: resultCmd
value: 'echo $?'
则CCD_ 2,但eval命令不返回任何内容。
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
注意,我可以在容器中运行这两个命令
kubectl exec -ti mypod bash
#ls;eval $resultCmd
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
**0**
我怎样才能让它工作?提前感谢
之所以会出现这种情况,是因为您使用了双引号而不是单引号。单引号不能代替任何东西,但双引号可以。
来自bash文档:
3.1.2.2单个报价
将字符用单引号括起来(
'
(可保留文字引号中每个字符的值。一句话可能不会出现在单引号之间,即使前面有反斜杠。
总结一下,您的命令应该是这样的:
kubectl exec -ti firstpod -- bash -c 'ls; echo $?'
使用POSIX shelleval
命令99.999%的时间是错误的。即使您在这个问题中忽略了Kubernetes的存在。问题中的问题是,kubectl
命令正在运行kubectl
命令的shell中扩展$resultCmd
的定义。特别是由于您使用了双引号。该交互式外壳不知道CCD_ 8在您的";"清单";文件所以这个shell什么都不替换$resultCmd
。
感谢Kurtis Rader和Thomas的回答。
当我在$之前时,它也起作用?带有反斜杠:
kubectl exec -ti firstpod -- bash -c "ls; echo $?"