为什么没有设置这个环境变量?

Tim*_*Tim 1 shell bash environment-variables quoting

  1. 当 shell 将外部可执行文件作为命令运行时,我们可以将环境变量传递给可执行文件。

    $ var=3 /bin/echo `$var`
    
    $ var=3 bash -c "/bin/echo '$var'"
    
    Run Code Online (Sandbox Code Playgroud)

    两者都不输出任何东西。

  2. 当程序由 执行时exec,我想看看环境变量是否也有效:

    $ bash
    $ unset var; 
    $ var=3 exec /bin/echo '$var'
    $var
    $ exec var=3 /bin/echo '$var'
    bash: exec: var=3: not found
    
    Run Code Online (Sandbox Code Playgroud)

为了防止变量扩展,我在$var. 保护似乎有点过分了。

为什么在上述情况下没有设置这个环境变量?

我可以让环境变量为由 执行的程序工作exec吗?

谢谢。

Ste*_*itt 5

请记住,参数扩展不会神奇地发生,您需要一个 shell 来为您完成。

var=3 /bin/echo `$var`
Run Code Online (Sandbox Code Playgroud)

我不确定你想用那个做什么,反引号在这里不合适(它们执行一个命令并用它的输出替换)。

var=3 bash -c "/bin/echo '$var'"
Run Code Online (Sandbox Code Playgroud)

不起作用,因为参数扩展发生在赋值之前,所以当前 shell 更改"/bin/echo '$var'"/bin/echo ''(假设var未定义),并且子 shell 使用

/bin/echo ''
Run Code Online (Sandbox Code Playgroud)

尝试

var=3 bash -c 'echo $var'
Run Code Online (Sandbox Code Playgroud)

相反:这里的单引号保护参数不受当前 shell 的影响,并且新的 shell 使用

echo $var
Run Code Online (Sandbox Code Playgroud)

它将按照您的预期进行处理。

在你的第二点中,我最初的评论仍然适用。如果您想尝试一下环境并查看会发生什么,请运行env并过滤其输出:

var=3 env | grep var
var=3 exec env | grep var
Run Code Online (Sandbox Code Playgroud)