2016-08-03 38 views
2

我看了linux命令env手冊,具體而言,對於-i選項,手冊上說:爲什麼ENV -i不匹配的命令手動

-i,--ignore環境#開始一個空的環境

我得到的是,當指定-i選項時,環境是空的,即沒有環境變量是存在的,所以命令env -i ls應打印像沒有發現命令,但我看到的是命令執行成功。所以請解釋一下,我誤解了什麼?

回答

0

環境是指您在登錄時在.bashrc和.bash_profile中設置的所有shell變量。如果你正在編譯一些東西,你可以設置CFLAGS變量。如果您在奇怪的目錄中安裝了某些東西,則可以執行export PATH=$PATH:$HOME/build/bin以允許其在未指定完整路徑的情況下運行。

env -i清除所有這些用戶設置變量併爲您提供一個空白環境,例如,您可以測試命令是如何工作的,如果沒有設置這些額外變量。

+0

根據你的回答,'env -i'應該清除所有這些用戶設置變量,包括'PATH' varibale,所以shell不應該找到'ls'的位置,但結果與我的不匹配思緒之中。 – Tracy

+0

將*用戶添加*包含到PATH變量中。基本OS PATH變量(我認爲你在/ etc/skel中設置的所有內容)通過清除環境持續存在,因此/ bin,/ usr/bin和/ usr/local/bin等內容將會保留。 – ijustlovemath

+1

我認爲最好是閱讀源代碼以查明OS PATH變量是否通過清除環境持續存在 – Tracy

1

我覺得更好的閱讀源代碼,找出OS PATH變量是否仍然存在通過環境的結算特雷西 -

閱讀源代碼,當然會提供有關的所有信息物。但是,我們也可以通過使用strace獲得有價值的線索:

 
>strace -eexecve env -i ls  
execve("/usr/bin/env", ["env", "-i", "ls"], [/* 48 vars */]) = 0 
execve("ls", ["ls"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
execve("/bin/ls", ["ls"], [/* 0 vars */]) = 0 

我們看到,env沒有嘗試的路徑首先,它失敗,然後嘗試執行"/bin/ls",其成功執行"ls"。我們也看到它開始於一個空的環境[/* 0 vars */]

 
>strace -eexecve env -i foo 
execve("/usr/bin/env", ["env", "-i", "foo"], [/* 48 vars */]) = 0 
execve("foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
execve("/bin/foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
execve("/usr/bin/foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory) 
env: foo: No such file or directory 

當指定一個不存在的命令或居住在其他一些路徑的命令,我們可以看到,env終於嘗試了/usr/bin/路徑,這就是它。所以,顯然/bin//usr/bin/env中被硬編碼,並且-i命令的環境確實是空的。另一個測試:

 
>env -i strace ls 
strace: ls: command not found 

如果ls應不直接由env -i執行,而是間接地通另一命令時,它找不到。