簡體   English   中英

為什么 `env -i` 無法忽略我的環境?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM