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

为什么这个环境变量没有设置呢?
  1. 当 shell 作为命令运行外部可执行文件时,我们可以将环境变量传递到可执行文件中。

    $ var=3 /bin/echo `$var`
    
    $ var=3 bash -c "/bin/echo '$var'"
    

    两者都不输出任何内容。

  2. 当程序执行时exec,我想看看环境变量是否也起作用:

    $ bash
    $ unset var; 
    $ var=3 exec /bin/echo '$var'
    $var
    $ exec var=3 /bin/echo '$var'
    bash: exec: var=3: not found
    

为了防止变量扩展,我在 周围使用单引号$var。保护似乎有点过分了。

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

我可以使环境变量适用于执行的程序exec吗?

谢谢。

答案1

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

var=3 /bin/echo `$var`

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

var=3 bash -c "/bin/echo '$var'"

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

/bin/echo ''

尝试

var=3 bash -c 'echo $var'

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

echo $var

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

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

var=3 env | grep var
var=3 exec env | grep var

答案2

  • 您的所有问题都与引用有关,而不是环境。

    1. 命令的环境。

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

    是的,这是一种为命令(外部或其他)设置环境变量的方法。

    但是你在这一行中缺少什么[a]

    $ var=3 /bin/echo "$var"
    

    shell 在构建参数时扩展变量,并且,如果var启动命令的 shell 中未设置该变量,则实际执行的内容如下:

    $ var=3 /bin/echo ""
    

    要实际查看当前的 shell 扩展,请运行以下命令:

    $ var=RunningShell ;   var=3 /bin/echo "$var"
    RunningShell
    

    延迟变量评估的一种(通常是不安全的)方法是:

    $ var=3 eval /bin/echo '"$var"'
    3
    

    在第二个示例中,您交换了报价:

    $ var=3 bash -c "/bin/echo '$var'"
    

    不打印任何内容,实际命令行变为:

    $ var=3 bash -c "/bin/echo ''"
    

    随着(未设置)变量 $var 的值扩展。你的意思可能是这样的:

    $ var=thisis3 bash -c '/bin/echo "$var"'
    thisis3
    

    在这种情况下,单引号会阻止执行 shell 扩展变量,而将扩展留给执行 shell ( bash -c)。

    • 使用 env 来实际查看环境。

      1. 当程序由 exec 执行时,我想看看环境变量是否也起作用:

    不要在当前的 shell 中执行,因为它将关闭正在运行的 shell。
    您可以这样做以避免关闭正在运行的 shell:

    $ var=3 exec /bin/echo \$var | cat
    $var
    

    由于封闭壳将是无论如何都会关闭的壳,即管道的第一个子壳。

    但这不会向您显示 var 在环境中的价值。要查看环境中的变量,请使用命令查看环境:

    $ var=3 env | grep var
    var=3
    

[a] 您编写的命令有反引号`,将它们更改为单引号将避免变量扩展并打印$var.:

$ var=3 /bin/echo '$var'
$var

相关内容