Linux

當我使用 env -i bash 啟動 Bash shell 時,PATH 變數設置在哪裡?

  • March 18, 2020

我知道環境變數是通過讀取或執行幾個配置文件來設置的,例如/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中的變數是怎麼設置的呢?是否有特定的文件可供讀取或獲取?

檢查printenvPATH 是否沒有值。如果您找到某些東西,它可能來自您的~/.bashrc. 如果它是空的,它是由 Bash 自己設置的。當 shell 啟動時,如果它找不到 PATH 的值,它將設置為 1,因為沒有 PATH 將無法正常工作。

您可以在原始碼中看到這是如何完成的(我正在查看 Bash 4.4 的原始碼):

variables.c

 /* 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 放入通常被認為是不好的做法,.因為它很容易意外地執行一些事情!

引用自:https://unix.stackexchange.com/questions/479071