環境變量——bash shell使用環境變量來存儲系統相關數據,並容許將數據存儲在內存中。linux
環境變量分爲:全局環境變量
shell
本地環境變量vim
目錄bash
全局環境變量less
本地環境變量ssh
設置全局環境變量ide
刪除環境變量函數
PATH全局環境變量this
設置系統環境變量的相關文件(登陸、非登陸、交互、非交互shell)idea
1、全局環境變量
在當前shell和子shell均可見
能夠用printenv命令查看全局環境變量,大寫表示是系統環境變量,小寫表示是普通用戶的環境變量
這是bash shell的一個標準約定,不是必須的,所以在設置新的環境變量的時候咱們用小寫就好了,用於區分我的和系統環境變量。
[root@CentOS6 ~]# printenv TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=172.18.251.124 8132 22 QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include SSH_TTY=/dev/pts/4 name=hello # 本身定義的環境變量 USER=root LS_COLORS=... MAIL=/var/spool/mail/root PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root LANG=en_US.UTF-8 PS1=[\[\e[33m\]\u@\[\e[34m\]\h \[\e[m\]\W]\$ \[\e[m\] SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass HISTCONTROL=ignoredups PS2=\[\e[34m\]> \[\e[m\] SHLVL=1 HOME=/root LOGNAME=root QTLIB=/usr/lib64/qt-3.3/lib CVS_RSH=ssh SSH_CONNECTION=172.18.251.124 8132 172.18.250.183 22 LESSOPEN=||/usr/bin/lesspipe.sh %s DISPLAY=localhost:12.0 G_BROKEN_FILENAMES=1 _=/usr/bin/printenv
大部分變量都是在登陸主shell時設置的
2、本地環境變量
只在當前shell中可見
能夠經過set命令查看,不過set命令查看的是全部環境變量(全局和本地)
注意在設置環境變量的時候,[變量=值]之間不能添加空格,要否則shell會把它當作一個單獨的命令執行
3、設置全局環境變量
使用export命令將本地環境變量變爲全局環境變量
4、刪除環境變量
使用unset命令能夠刪除環境變量,格式爲
unset 變量名
不過對於全局環境變量的刪除,咱們要注意:
若是在子shell下刪除全局環境變量,刪除操做只對子shell有效,若是回到父shell下,該全局變量還能引用
5、PATH全局環境變量
修改PATH環境變量:
PATH=$PATH:新加目錄
小技巧:
咱們能夠將PATH設置爲PATH=$PATH:.(單個點表明當前工做目錄)
6、設置系統環境變量的相關文件
系統環境變量是在shell啓動過程當中執行相關的文件定義的。這些文件被稱爲shell啓動文件。不過咱們在設置系統環境變量的時候,咱們要區分登陸式shell、非登陸式shell、交互式shell、非交互式shell的區別,(登陸/非登陸和交互/非交互只是劃分的標準不同)只有弄清除了不一樣模式的shell才能正確修改相應的shell啓動文件以致於可以正確設置系統環境變量。
正好最近也在接觸Linux系統啓動流程,這也會涉及到登陸一個shell的過程。
6.1 登陸式shell
登陸式shell是用戶須要輸入用戶名和密碼的shell,該模式的shell啓動過程當中會依次執行下列文件,
/etc/profile # 登陸bash shell的默認主啓動文件。任何用戶登陸shell都會執行此啓動文件。不建議修改
~/.bash_profile
~/.bash_login
~/.profile # 上訴這三個$HOME啓動文件是定義對應用戶的環境變量。不一樣linux發行版使用的文件不一樣
/etc/profile中的命令和腳本不是咱們如今關注的,咱們主要來看看export那一行,所以咱們能夠知道該文件是設置系統全局環境變量
/etc/profile另外一個重要的功能就是可以重複執行/etc/profile.d/目錄下的文件(大可能是.sh和.csh結尾的文件),這些文件大概是特定應用程序的啓動文件,可以設置相關應用程序的環境變量,例如/etc/profile.d/lang.*sh 就是用來設置LANG環境變量的。
[root@CentOS6 ~]# cat /etc/profile # /etc/profile # System wide environment and startup programs, for login setup # Functions and aliases go in /etc/bashrc # It's NOT a good idea to change this file unless you know what you # are doing. It's much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates. ... export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL ... for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null 2>&1 fi fi done unset i unset -f pathmunge [root@CentOS6 ~]#
$HOME啓動文件,個人系統用的~/.bash_profile,這些文件都是以.開頭,表明了都是隱藏文件,同時是針對特定用戶的,所以用戶能夠修改該文件。
咱們看下~/.bash_profile文件下的內容定義PATH的那一行。$HOME文件定義特定用戶的PATH=$PATH:$HOME/bin,表明咱們能夠將可執行文件放在$HOME/bin目錄下。
[root@CentOS6 profile.d]# cat ~/.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
6.2 非登陸式shell
登陸式shell是須要輸入用戶名、密碼登陸的shell,而非登陸式shell則是不須要的,例如直接在命令行輸入bash、在圖形化界面點擊open in terminal開啓命令行終端等都是非登陸式shell。
另外,對於退出shell的命令exit和logout的區別,exit命令能夠退出登陸式shell和非登陸式shell,logout只能退出登陸式shell。
咱們能夠經過$0變量值來查看是登陸式shell仍是非登陸式shell,登陸式shell會在前面顯示‘-’非登陸式shell則沒有
在非登陸式shell的啓動過程當中,因爲不須要重複的登陸shell,因此非登陸shell只須要執行下列文件便可,
$HOME/.bashrc # 下面的內容說明
[root@CentOS6 ~]# cat ~/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias cdnet='cd /etc/sysconfig/network-scripts/' alias ping='ping -c 4' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi
該$HOME/.bashrc能夠定義用戶自定義的別名和函數,另外還有引用公共/etc/bashrc下的變量,咱們來看看/etc/bashrc文件內容
[root@CentOS6 ~]# cat /etc/bashrc # /etc/bashrc # System wide functions and aliases # Environment stuff goes in /etc/profile # It's NOT a good idea to change this file unless you know what you # are doing. It's much better to create a custom.sh shell script in # /etc/profile.d/ to make custom changes to your environment, as this # will prevent the need for merging in future updates. # are we an interactive shell? ... # Only display echos from profile.d scripts if we are no login shell # and interactive - otherwise just process them to set envvars for i in /etc/profile.d/*.sh; do if [ -r "$i" ]; then if [ "$PS1" ]; then . "$i" else . "$i" >/dev/null 2>&1 fi fi done unset i unset pathmunge fi # vim:ts=4:sw=4
另外該文件也會執行/etc/profile.d/*.sh來設定特定應用程序的環境變量。
其實登陸式shell也會執行$HOME/.bashrc,能夠回到上面的~/.bash_profile的代碼部分,咱們會發現該文件中會調用$HOME/.bashrc文件。這樣說能夠加深登陸式shell和非登陸式shell的本質區別。
6.3 交互式shell
咱們經過終端登陸Linux,輸入命令,shell執行命令並實時返回結果,退出。這種模式就是交互式shell。
在交互式shell下,bash不會執行/etc/profile文件,代替而之的是$HOME/.bashrc文件,執行的啓動文件和非登陸式shell同樣。
這個文件定義新交互式shell的環境變量,該文件最好不要定義全局環境變量(export),另外該文件也會執行/etc/profile.d/*.sh來設定特定應用程序的環境變量。任何開啓交互式子shell(bash、su - user)的操做都會讀取$HOME/.bashrc。
6.4 非交互式shell
和交互式shell相反,該模式下shell不與終端進行交互,例如以shell腳本的方式讀取腳本中命令,而不須要與終端交互(除非須要用戶輸入參數的命令),當文件結束時,該shell也就退出了。
非交互式shell的相關啓動文件和系統設置的一個全局環境變量BASH_ENV相關。該變量默認狀況下沒有定義。咱們須要手動設置該變量,當執行shell腳本的時候,會執行該變量指向的文件。
咱們能夠利用$-的變量值來查看當前shell是交互式仍是非交互式的,以下圖:
vim tmp.sh #!/bin/bash echo $-
區分交互式和非交互式就是看是否有‘i’(interactive),能夠看出腳本中爲非交互式,咱們平時用的終端爲交互式。
6.5 總結
登陸式shell,包括依次要執行的啓動文件和文件代碼部分要調用的文件,對他們歸納以下:
非登陸式shell
交互式shell
執行啓動文件過程相似於非登陸式shell
非交互式shell
執行BASH_ENV全局環境變量指向的文件
知道了這些啓動文件的區別後,咱們能夠針對性的修改啓動文件以使自定義的全局環境變量、別名等永久生效,例如咱們能夠將全部自定義的全局環境變量放在一個.sh結尾的文件中,而後將該文件放到/etc/profile.d/目錄下或者將自定義的變量放入/etc/bashrc文件中,這樣將對全部的用戶都生效。而對於一些針對我的用戶的別名等,能夠將其寫入到~/.bashrc文件中,只對單個用戶有效。