【发布时间】:2019-01-13 18:19:48
【问题描述】:
我在 Windows 10 和 bash 上使用 WSL (Ubuntu 18.04)。
我有一个文件filename.gpg,内容如下:
export SOME_ENV_VAR='123'
现在我运行以下命令:
$ $(gpg -d filename.gpg)
$ echo $SOME_ENV_VAR
'123' <-- with quotes
但是,如果我直接在 shell 中运行它:
$ export SOME_ENV_VAR='123'
$ echo $SOME_ENV_VAR
123 < -- without quotes
为什么会这样?为什么使用$() 运行命令和直接运行有区别?
除此之外:我使用 eval $(gpg -d filename) 让它工作,我不知道为什么会这样。
【问题讨论】:
-
Ubuntu 默认使用 dash 不是吗?你是用 bash 调用脚本吗?
-
引号在 shell 脚本中的行为与在交互式命令中的行为完全相同。问题是您没有将
filename作为脚本运行。提示:$(cat filename)与$(echo "export SOME_ENV_VAR='123'")相同。 -
这也是BashFAQ #50。顺便说一句,使用
eval的方式本身就是错误的。至少,添加更多引号:eval "$(gpg -d filename)"- 这样您就不会在将这些操作的结果连接在一起并将结果提供给eval进行解析之前对解密的内容进行字符串拆分和全局扩展。跨度>