![](/img/trans.png)
[英]Why does my Perl script fail on “~/” but works with “$ENV{HOME}”?
[英]Why does `env -i` fail to ignore my environment?
致謝:也許我誤解了“環境”的含義。
env 的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
產生空的i
(有道理... environment 應該被忽略,但這似乎與env - echo $PATH
打印我的環境的PATH
不一致。)
在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.