kubernetes 在环境中执行命令。带有 eval 的变量

kubernetes execute a command in a env. varible with eval

我想在容器中执行一个命令(假设为 ls)然后用 echo $? 读取退出代码 kubectl exec -ti mypod -- bash -c "ls; echo $?" 不起作用,因为它 return 是我当前 shell 的退出代码,而不是容器之一。

所以我尝试在清单中定义的环境变量上使用 eval :

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - container2
    image: varunuppal/nonrootsudo
    env:
    - name: resultCmd
      value: 'echo $?'

然后 kubectl exec -ti mypod -- bash -c "ls;eval $resultCmd" 但是 eval 命令没有 return 任何东西。

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**

我怎样才能让它发挥作用? 提前致谢,

99.999% 的情况下,使用 POSIX shell eval 命令是错误的。即使你在这个问题中忽略了 Kubernetes 的存在。您问题中的问题是您的 kubectl 命令正在扩展 shell 中 $resultCmd 的定义,您 运行 kubectl 命令。特别是由于您使用 double-quotes。该交互式 shell 不知道您的“清单”文件中 $resultCmd 的定义。因此 shell 将 $resultCmd 替换为空。

发生这种情况是因为您使用双引号而不是单引号。 单引号不能替代任何东西,但双引号可以。

来自 bash 文档:

3.1.2.2 Single Quotes

Enclosing characters in single quotes (') preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

总而言之,您的命令应该如下所示:

kubectl exec -ti firstpod -- bash -c 'ls; echo $?'

感谢 Kurtis Rader 和 Thomas 的回答。

当我在 $?带反斜杠 :

kubectl exec -ti firstpod -- bash -c "ls; echo $?"