我需要在bash -c "..."
构造中运行命令。实际命令调用Vault CLI tool生成TLS证书。需要注意的重要一点是CLI工具需要设置一个名为VAULT_TOKEN
的变量。
就本例而言,假设本地目录中有名为token
和options
的文件,其中包含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的非常不完善的了解):
"..."
字符串的内容视为脚本。然后,该脚本将执行以下操作:token
的文件中获取令牌,将该值导出到变量中,以便子进程可以访问它(因此使用export
)。bash -c
脚本内容范围内可见的shell变量中。$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
中得到一个空字符串。
很显然,我对命令替换/变量求值的理解是错误的-请提供以下建议:
$VAULT_TOKEN
在$(...)
命令替换中不可见?$VAULT_TOKEN
命令可见vault
?由于其他原因,我必须以bash -c
的方式运行这组命令,所以我不能将这些命令分成脚本。