我看了linux命令env
手冊,具體而言,對於-i
選項,手冊上說:爲什麼ENV -i不匹配的命令手動
-i,--ignore環境#開始一個空的環境
我得到的是,當指定-i
選項時,環境是空的,即沒有環境變量是存在的,所以命令env -i ls
應打印像沒有發現命令,但我看到的是命令執行成功。所以請解釋一下,我誤解了什麼?
我看了linux命令env
手冊,具體而言,對於-i
選項,手冊上說:爲什麼ENV -i不匹配的命令手動
-i,--ignore環境#開始一個空的環境
我得到的是,當指定-i
選項時,環境是空的,即沒有環境變量是存在的,所以命令env -i ls
應打印像沒有發現命令,但我看到的是命令執行成功。所以請解釋一下,我誤解了什麼?
環境是指您在登錄時在.bashrc和.bash_profile中設置的所有shell變量。如果你正在編譯一些東西,你可以設置CFLAGS
變量。如果您在奇怪的目錄中安裝了某些東西,則可以執行export PATH=$PATH:$HOME/build/bin
以允許其在未指定完整路徑的情況下運行。
env -i
清除所有這些用戶設置變量併爲您提供一個空白環境,例如,您可以測試命令是如何工作的,如果沒有設置這些額外變量。
我覺得更好的閱讀源代碼,找出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
執行,而是間接地通另一命令時,它找不到。
根據你的回答,'env -i'應該清除所有這些用戶設置變量,包括'PATH' varibale,所以shell不應該找到'ls'的位置,但結果與我的不匹配思緒之中。 – Tracy
將*用戶添加*包含到PATH變量中。基本OS PATH變量(我認爲你在/ etc/skel中設置的所有內容)通過清除環境持續存在,因此/ bin,/ usr/bin和/ usr/local/bin等內容將會保留。 – ijustlovemath
我認爲最好是閱讀源代碼以查明OS PATH變量是否通過清除環境持續存在 – Tracy