为什么在“ bash -c”中的命令替换中的变量不可见?

时间:2019-01-05 13:53:05

标签: bash

我需要在bash -c "..."构造中运行命令。实际命令调用Vault CLI tool生成TLS证书。需要注意的重要一点是CLI工具需要设置一个名为VAULT_TOKEN的变量。

就本例而言,假设本地目录中有名为tokenoptions的文件,其中包含Vault需要的数据。这些与问题无关。

我的脚本:

/bin/bash -c "export VAULT_TOKEN=$(cat token); \
    CERT_OPTIONS=$(cat options); \
    CERT=\"$(echo \$CERT_OPTIONS | vault write pki/issue/default -format=json -)\"; \
    echo cert=\$CERT"

命令(echo cert=\$CERT)中的最后一条语句只是一个占位符以说明问题,通常我会使用$CERT的值。

我对上述操作的理解(基于对Bash的非常不完善的了解):

  1. Bash被调用,并将"..."字符串的内容视为脚本。然后,该脚本将执行以下操作:
  2. 从名为token的文件中获取令牌,将该值导出到变量中,以便子进程可以访问它(因此使用export)。
  3. 从文件中获取选项,并将其放入在bash -c脚本内容范围内可见的shell变量中。
  4. 通过命令替换启动一个单独的进程,该进程将调用Vault,并且$VAULT_TOKEN对于该进程应该是可见的,因为它是运行bash -c的脚本的子进程。

但是,我看到的是一个错误,指示未设置$VAULT_TOKEN,即vault CLI工具抛出一个错误,指出它没有$VAULT_TOKEN的值。

当我进一步简化命令为:

/bin/bash -c "export VAULT_TOKEN=$(echo token); \
    CERT=\"$(echo \$VAULT_TOKEN > /tmp/test.out)\"; \
    echo cert=\$CERT"

我可以看到:

> cat /tmp/test.out
$VAULT_TOKEN

...不是我所期望的token

我逃避了VAULT_TOKEN的回声(通过echo \$VAULT_TOKEN),因为否则我相信它将从我的shell(未设置)中被Bash替换为$VAULT_TOKEN的值。 ),因此我在/tmp/test.out中得到一个空字符串。

很显然,我对命令替换/变量求值的理解是错误的-请提供以下建议:

  1. 为什么$VAULT_TOKEN$(...)命令替换中不可见?
  2. 如何使$VAULT_TOKEN命令可见vault

由于其他原因,我必须以bash -c的方式运行这组命令,所以我不能将这些命令分成脚本。

0 个答案:

没有答案