这显然是一个 SSCCE,所以它(本身)没有任何意义。例如Y
,在这个最小的例子中没有使用变量赋值;我只是想找出适用于我的实际情况的正确语法。
我可以直接在 bash shell 上执行以下操作:
Y=10 echo foo
我还可以在 bash 文件中包含以下内容foo.sh
:
#!/bin/bash
X="echo foo"
$X
...然后执行:
$./foo.sh
foo
但是,当我的 bash 文件中有以下内容时:
#!/bin/bash
X="Y=10 echo foo"
$X
...然后,我得到:
$ ./foo.sh
./foo.sh: line 3: Y=10: command not found
上述内容的正确语法是什么?
答案1
问题是可选参数分配被识别前发生参数扩展,因此该行
$X
被识别为没有前面分配的命令。假定扩展结果的第一个单词是命令名称,因此 shell 尝试运行Y=10
.
通常情况下,您不应尝试将代码存储在变量中,而应存储在函数中。
X () {
Y=10 echo foo
}
答案2
事实证明,我下面描述的只是最小示例的产物,其中省略了Y
使用的部分。
该行中的命令之前有一个变量赋值:
Y=10 echo foo
该赋值操作将在执行期间将变量设置Y
为。因为没有使用,所以赋值没有效果。10
echo foo
echo foo
Y
在问题和答案中该命令的所有变体中,这是相同的 -Y=10
在那里没有效果。
答案3
如果您必须这样做,请使用env
:
$ X='env Y=10 echo foo'
foo
...并展示$Y
...
$ X='env Y=10 env'
$ $X | grep \^Y
Y=10
...但是函数更好。
答案4
发生参数扩展后再次解析命令的方法是
X="Y=10 echo foo"
eval "$X"
我假设您有一个现实的理由想要这样做。