幾句話說清Bash Shell環境變量

一、環境變量的種類

環境變量在Linux系統中的重要性不必多說,以下就以CentOS7爲例,詳細闡述系統的環境變量。當用戶登錄Linux系統啓動一個bash shell時,系統默認會在幾個文件中查找命令,這些文件就被稱爲環境文件。bash shell查找的環境文件取決於啓動bash shell的方式。bash shell的啓動方式可分爲以下3種:
1. 用戶登陸時作爲默認登陸shell。
2. 作爲非登陸shell的交互式shell(比如登陸後通過bash啓動的子shell)。
3. 作爲運行腳本的非交互shell。
以下就上述3種shell的環境變量文件查找進行詳細說明。

二、3種shell的環境變量文件

1.登陸shell
當一個用戶登陸Linux系統時,首先會檢查/etc/profile文件(也會根據該文件的設置檢查/etc/profile.d目錄下的所有文件),/etc/profile文件是系統上默認的bash shell主啓動文件,每個登錄用戶都會執行這個啓動文件。
其次,會檢查用戶的專屬啓動文件,大多數Linux發行版只用到下面4個啓動文件中的1~2個,這4個啓動文件起到一個共同的作用:定義用戶專屬的環境變量。
(1) $HOME/.bash_profile
(2) $HOME/.bashrc
(3) $HOME/.bash_login
(4) $HOME/.profile
通常shell會按照下列順序,找到第一個被找到的文件,餘下的則會被忽略:
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
可以發現,上述3個文件中並沒有$HOME/.bashrc,這是因爲該文件通常通過其他文件運行。

[root@host3 ~]# vim .bash_profile   

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

可以看到$HOME/.bash_profile其實是讀取了$HOME/.bashrc文件。
2.交互式shell進程
當你的shell不是登陸系統時啓動的(比如在系統內輸入bash命令啓動的子shell),此時啓動的shell則成爲交互式shell,因爲該shell同樣可以提供一個命令提示符來輸入命令。此時與登陸shell的區別在於:不會檢查
/etc/profile文件和/etc/profile.d目錄下的所有文件,只會按順序檢查
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
通常情況下,只檢查$HOME/.bashrc文件。
3.非交互式shell
系統在執行腳本時用到的就是這種shell,他沒有命令提示符,bash會通過BASH_ENV環境變量來檢查要啓動的文件,但CentOS系統中默認該變量爲空

[root@host3 ~]# echo $BASH_ENV

[root@host3 ~]# 

此時的環境變量則爲繼承父shell的(腳本是當前shell中啓動的一個子進程),需要注意的是:如果父shell中定義但未導出的環境變量屬於局部變量,子shell不能繼承。

三、總結

通過前文知道了環境變量文件啓動的條件,通常情況下,個人永久環境變量存放在$HOME/.bashrc下,這一點適用於所有類型的shell進程;對於全局變量(所有linux用戶都需要用到的變量)可以放在/etc/profile文件中,但建議存放在/etc/profile.d目錄下一個以.sh結尾的文件中,它的好處是當系統版本升級時,/etc/profile文件會隨之更新,定製的變量設置則會清空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章