1. 程式人生 > >/etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc檔案呼叫順序解析

/etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc檔案呼叫順序解析

問題:

今天在安裝pyenv的時候碰到了這麼個問題:

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

大概意思就是說,pyenv這個二進位制還沒有加入載入路徑,從它給出的補救方法可以看出,我們要對PATH進行適當的修改,並且執行後面兩個eval裡面的命令

於是按照所說的去做,並不其作用。

谷歌了一下~/.bash_profile這個檔案,發現了網上有一些關於如題所示四個檔案的呼叫順序,然後發現這些文章講的並不是很清晰:有個問題會在login shell呼叫,有的會在新建bash shell時呼叫,有的又會在某種情況下呼叫。因為對這些東西沒有清晰的概念(雖然有一定的瞭解),所以想做個實驗證明下他們的呼叫順序問題。

他們的呼叫順序應是如下面所是:

/etc/profile->~/.bash_profile->~/.bashrc->/etc/bashrc

(這裡面後兩個箭頭是在判斷該檔案存在了才會去呼叫)、

1,首先我在四個檔案當中分別插入“echo 檔名”這樣的語句,其中檔名分別對應著四個檔案的完整路徑。在terminal中輸入bash,輸出/home/laozhikun/.bashrc和/etc/bashrc,其他兩個檔案沒有被呼叫。

問題:/etc/profile和~/.bash_profile什麼時候被呼叫?

2,查詢資料,發現對/etc/profile檔案的修改只有在系統重啟後才會生效,於是重啟動

3,重啟動後,重新開啟terminal,仍然只輸出/home/laozhikun/.bashrc和/etc/bashrc。查詢資料,發現/etc/profile面對的是全域性,很有可能它的輸出不是在某個tty裡面輸出。於是在/etc/profile裡面加上一句“touch /tmp/aaaa”

4,重新啟動,立即在命令列開啟/tmp,可見aaaa,記錄修改時間,等兩分鐘,再重新啟動,再次查詢/tmp/aaaa,可見aaaa修改時間改變。過兩分鐘再次開啟terminal,可見aaaa時間戳未改變,可知/etc/profile的呼叫是在開機的時候呼叫的

5,受/etc/profile檔案啟發,對~/.bash_profile進行了相似的修改->加上"touch /tmp/bbbb",並且重啟

6,可見/tmp出現bbbb檔案,記錄時間戳,等兩分鐘,再次重啟動,可見bbbb時間戳改變,過兩分鐘開啟terminal,可見bbbb時間戳為改變,可見~/.bash_profile的呼叫是在開機的時候呼叫的

7,那麼/etc/profile和~/.bash_profile的呼叫順序是什麼,通過man ls得到ls的一個引數--full-time,它能夠準確現實檔案被touch的時間戳。重啟電腦,通過觀察aaaa和bbbb的精確時間戳,可以發現aaaa的touch時間比bbbb的touch時間早,所以/etc/profile檔案應比~/.bash_profile呼叫順序要早

8,受此啟發,對~/.bashrc和/etc/bashrc分別進行了新增“touch cccc”和新增“touch dddd”的修改,並且重新啟動

9,開機之後不使用terminal檢視時間戳,因為開啟shell會呼叫~/.bashrc和etc/bashrc,我們使用Fedora自帶的檔案管理其進行檢視,並且將檔案排序方式設定為按照修改時間排序,可見修改時間為aaaa<bbbb<cccc<dddd,可見呼叫順序為/etc/profile->~/.bash_profile->~/.bashrc->/etc/bashrc

10,啟動shell(terminal),可cccc和dddd在檔案管理器中的順序被移到了最後,而另外一個本來在cccc和dddd之後的臨時檔案被擠到了倒數第三,此時cccc<dddd,可見開啟terminal只調用~/.bashrc和/etc/bashrc,並且呼叫順序為~/.bashrc->/etc/bashrc

11,蹤上,呼叫順序為/etc/profile->~/.bash_profile->~/.bashrc->/etc/bashrc,其中前兩個只在登陸系統呼叫,後面兩個在登陸系統和開啟新的shell的時候都呼叫

12,畫圖如下:


13,迴歸到遇到的問題,pyenv給出的補救方法必須在重啟後才能生效,如果想不重啟而生效,可以在~/.bashrc裡面新增那段補救命令,然後執行bash,而不是加在~/.bash_profile中