如何在调用子流程之前使用另一个变量设置环境变量?

如何在调用子流程之前使用另一个变量设置环境变量?

我有一个像这样的 bash 脚本

# print.sh
# export FOO=test would work too
FOO=test ./foo-proj # Something that cares about FOO (shell script or just a binary)

这有效。但是,我想知道为什么如果我这样做......

#print.sh
blah="FOO=test"
$blah ./foo-proj

我收到这个错误./print.sh: line 2: FOO=test: command not found。就像 bash 现在解释FOO=test为命令而不是变量声明。有没有办法解决?

答案1

一些选项:

env -- "$blah" ./foo-proj

在那里, env 调用其环境中./foo-proj的内容。$blah优点是在这种情况下变量名称不限于有效的 shell 变量名称。例如,您可能必须blah='+++=xxx'传递一个名为“+++即使”的环境变量+++不是有效的 shell 变量名称。

(export -- "$blah"; exec ./foo-proj)

或者:

eval  " $blah ./foo-proj"

其中eval将作为一个参数传递" FOO=test ./foo-proj",然后该字符串将被评估为 shell 代码(其中将=是文字,因此被视为分配)。

但请注意,如果$blahblah='FOO=test;reboot;',它会重新启动。

答案2

我认为在你的情况下,bash 不会将 检测$blah为环境变量,而是检测为包含=.

你需要做类似的事情:

blah="test"
FOO=$blah ./foo-proj

相关内容