【问题标题】:Why does `env -i` fail to ignore my environment?为什么 `env -i` 无法忽略我的环境?
【发布时间】:2020-12-10 10:59:47
【问题描述】:

致谢:也许我误解了“环境”的含义。

man page for env 声称env - [command](或env -i [command])应该在空环境中运行command。测试此行为,PATH 是一个环境变量(即“环境”的一部分)。但是,唉:

➜  ~ env - echo $PATH
/home/user/.nvm/versions/node/v15.3.0/bin:/home/user/.deno/bin:/usr/local/lib/node/nodejs/bin:/home/user/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

相同
➜  ~ echo $PATH
/home/user/.nvm/versions/node/v15.3.0/bin:/home/user/.deno/bin:/usr/local/lib/node/nodejs/bin:/home/user/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

那么,发生了什么事?其他一些环境变量也会出现这种情况,例如 $SHELL$USER

那么,有人可以定义“环境”吗?env实际上在使用env - [command]env -i [command] 时做了什么。

请注意,env - PATH= echo $PATH 会产生无法在路径上找到 echo 的预期结果。但是,对我来说很奇怪,我必须将该环境变量显式设置为一个空字符串,因为我表面上是在运行 [command] 之前清除我的环境。

奖金混乱:

env env 打印我环境的所有变量,而env - env 产生空输出(有道理...环境应该是ignored,但这似乎与env - echo $PATH 打印我的环境的PATH 不一致。)

【问题讨论】:

    标签: linux environment-variables


    【解决方案1】:

    env -i echo $PATH 中,变量由你的shell 扩展,所以env 程序永远看不到该变量。

    您可以生成一个子 shell 来检查变量;使用引号来防止父 shell 评估:

    A=1 env -i sh -c 'echo $A' # prints nothing
    A=1 env    sh -c 'echo $A' # prints 1
    A=1 env    printenv A      # prints 1
    

    PATH 是特殊的。即使您从环境中删除它,您的 shell 也可能会定义一个回退路径。那个不会导出到子进程,而只能作为 shell 变量可见。

    env -i printenv PATH       # prints nothing, PATH is no longer exported
    env -i sh -c 'echo $PATH'  # prints something like /sbin:/bin
    

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 2021-08-23
      • 2012-04-05
      • 1970-01-01
      • 2021-10-18
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      相关资源
      最近更新 更多