我有一个像这样的 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 代码(其中将=
是文字,因此被视为分配)。
但请注意,如果$blah
是blah='FOO=test;reboot;'
,它会重新启动。
答案2
我认为在你的情况下,bash 不会将 检测$blah
为环境变量,而是检测为包含=
.
你需要做类似的事情:
blah="test"
FOO=$blah ./foo-proj