在bash shell中,環境變數分為兩類: 全局變數 局部變數 全局環境變數 全局環境變數對於shell會話和所有生成的子shell都是可見的。例如 : 局部環境變數 局部環境變數只能在定義它們的進程中可見。Linux也定義了標準的局部環境變數。 使用 命令可以顯示該進程的所有環境變數,包括 局部 ...
在bash shell中,環境變數分為兩類:
- 全局變數
- 局部變數
全局環境變數
全局環境變數對於shell會話和所有生成的子shell都是可見的。例如HOME
:
[root@localhost ~]# bash // 進入子shell
[root@localhost ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 14862 14747 0 04:35 pts/0 00:00:00 -bash
root 15654 14862 0 04:36 pts/0 00:00:00 bash
root 15663 15654 0 04:36 pts/0 00:00:00 ps -f
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# exit
exit
[root@localhost ~]#
局部環境變數
局部環境變數只能在定義它們的進程中可見。Linux也定義了標準的局部環境變數。
使用set
命令可以顯示該進程的所有環境變數,包括局部變數、全局變數以及用戶定義變數:
[root@localhost ~]# set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
...
自定義環境變數
可以在bash shell中直接設置自己的變數。
- 自定義局部環境變數
父shell創建的局部環境變數,在子shell中不可見;(子shell局部環境變數,在父shell中不可見)。
[root@localhost ~]# my_variable="Hello World"
[root@localhost ~]# echo $my_variable
Hello World
[root@localhost ~]# bash
[root@localhost ~]# echo $my_variable
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $my_variable
Hello World
[root@localhost ~]#
- 自定義全局環境變數
可以通過export
命令將局部環境變數導出到全局環境變數:
[root@localhost ~]# my_variable="I am Global now"
[root@localhost ~]# export my_variable
[root@localhost ~]# echo $my_variable
I am Global now
[root@localhost ~]# bash
[root@localhost ~]# echo $my_variable
I am Global now
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $my_variable
I am Global now
[root@localhost ~]#
在子shell中改變父shell繼承的全局變數後,父shell中的值不會受影響,即使子shell使用了
export
命令。
刪除環境變數
可以通過unset
命令來刪除環境變數,同樣的,在子shell中刪除父shell繼承的全局環境變數時,對父shell無影響:
[root@localhost ~]# echo $my_variable
I am Global now
[root@localhost ~]# unset my_variable
[root@localhost ~]# echo $my_variable
[root@localhost ~]#
定位系統環境變數
啟動bash shell時會自動讀取一些已持久化的環境變數,具體讀取方式和bash的啟動方式有關:
- 登錄時作為預設登錄shell
- 作為非登錄shell的互動式shell
- 作為運行腳本的非交互shell
1.登錄shell
登錄Linux系統時,bash shell作為登錄shell啟動,會從5個文件讀取命令:
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bash_login
- $HOME/.profile
- $HOME/.bashrc
其中,/etc/profile
是系統預設bash shell的主啟動文件,系統上每個用戶登錄時都會啟動這個文件。
在centos系統中,這個文件會遍歷
/etc/profile.d
目錄下以.sh結尾的文件並運行。所以對於全局的每個用戶都需要的環境變數,我們可以在這個目錄下創建一個相應的文件。
在/etc/profile
啟動完成後,bash會到當前用戶目錄下找尋2、3、4指定的文件進行運行,按順序找到一個就忽略剩下的。
2.互動式shell進程
如果shell不是在登錄時啟動的(比如命令提示符中敲下bash啟動的),那麼這個shell叫作互動式shell。
互動式shell不會訪問/etc/profile
,只會檢查用戶HOME目錄下的.bashrc文件,也即是5。
3.非互動式shell
系統執行shell腳本時,使用的就是非互動式shell。在這種情況下,非互動式shell要想獲得初始的持久化環境變數,可以使用BASH_ENV
所指定的位置找尋。
持久化環境變數建議
- 儘量不修改
/etc/profile
,最好在/etc/profile.d
目錄下創建.sh結尾的文件。 - 對於個人用戶持久化變數,最好是
$HOME/.bashrc
。