Linux
當我使用 env -i bash 啟動 Bash shell 時,PATH 變數設置在哪裡?
我知道環境變數是通過讀取或執行幾個配置文件來設置的,例如
/etc/environment
,/etc/profile
,~/.profile
,~/.bashrc
等。但是當我閱讀這篇博文時,我嘗試使用以下命令在不導入環境的情況下啟動非登錄互動式 bash shell:
osboxes@osboxes:~$ env -i bash
進入新的shell後,我檢查了
PATH
變數,得到了以下結果:osboxes@osboxes:/home/osboxes$ echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
據我所知,這個非登錄互動式 shell 不讀取
/etc/environment
或獲取源/etc/profile
或~/.profile
; 它只有來源/etc/bash.bashrc
和~/.bashrc
。那麼
PATH
這個shell中的變數是怎麼設置的呢?是否有特定的文件可供讀取或獲取?
檢查
printenv
PATH 是否沒有值。如果您找到某些東西,它可能來自您的~/.bashrc
. 如果它是空的,它是由 Bash 自己設置的。當 shell 啟動時,如果它找不到 PATH 的值,它將設置為 1,因為沒有 PATH 將無法正常工作。您可以在原始碼中看到這是如何完成的(我正在查看 Bash 4.4 的原始碼):
/* Now make our own defaults in case the vars that we think are important are missing. */ temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE); #if 0 set_auto_export (temp_var); /* XXX */ #endif
您可以在
config-top.h
其中找到定義(與您顯示的 PATH 匹配):/* The default value of the PATH variable. */ #ifndef DEFAULT_PATH_VALUE #define DEFAULT_PATH_VALUE \ "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:." #endif
我相信將 PATH 放入通常被認為是不好的做法,
.
因為它很容易意外地執行一些事情!