5.1 什么時環境變量
bash shell用一個成為環境變量的特性來存儲有關的shell回話和工作環境的信息,這是它們成為環境變量的原因。它允許你在內存中存儲數據,以便運行在賬戶、系統、shell的特性以及任何其他你需要存儲的數據
- 環境變量的分類
- 全局變量
- 局部變量
5.1.1 全局環境變量
- 全局環境變量不僅對shell會話可見,而且對所有shell創建的子進程也可見,局部變量只是對創建的他們的shell可見
- 這對全局環境變量對那些子進程中需要獲得父進程信息的程序來說非常有用
- 系統環境變量一律使用全大寫字母以區別普通用戶的環境變量
- printenv:查看全局環境變量
- echo + $環境變量名:查看單個環境變量值
5.1.2 局部環境變量
- 局部變量只有在定義它們的進程中可見
- set命令:顯示為某個特定進程設置的所有環境變量,包括全局環境變量和局部環境變量
$ set .
BASH=/bin/bash
EUID=500 IFS=$' \t\n' ...
- 1
- 2
- 3
- 4
- 5
5.2 設置環境變量
5.2.1 設置局部環境變量
一旦開啟了bash shell(或者執行一個shell腳本),你就能創建在這個shell進程內可見的局部變量了
- 可以通過等號給局部變量設置,設置的值可以時數值或字符串
$ test=testing $ echo $test testing $
- 1
- 2
- 3
- 4
- 如果要給變量賦一個含有空格的字符串值,必須用單引號來界定字符串的開始和末尾
$ test='testing a long string' $ echo $test testing a long string $
- 1
- 2
- 3
- 4
- 局部變量一般用小寫字母
- 注意:在環境變名稱、等號和值之間沒有空格
- 設置了環境變量之后就可以在shell進程中使用它了,如果在子進程中設置了環境變量,一旦退出了子進程,那個局部變量就不能用了
5.2.2 設置全局環境變量
- 設置一個全局環境變量的方法:先設置一個局部變量,然后再把它導出到全局環境中
- 通過export命令來完成導出任務
$echo $test testing a long string $export test $bash $echo $test testing a long string $
- 1
- 2
- 3
- 4
- 5
- 6
- 7
刪除環境變量
- unset命令:刪除一個環境變量
- 用法:unset + 環境變量名
- 注意不加$符號
$ unset test $ echo test $
- 1
- 2
- 3
- 4
- 注意:如果僅僅在子進程中刪除了全部變量,那么僅僅對子進程有效,在父進程中依然有效
5.4 默認shell環境變量
默認情況下,bash shell 會用一些特定的環境變量來定義系統環境變量
bash shell時從Unix Bourne shell中衍生出來的,它保留有Unix Bourne shell里定義的那些環境變量
-
常見的shell支持的Bourne環境變量
- HOME:當前用戶的主目錄
- IFS:shell用來分隔文本字符串的一列字符
- PATH:冒號分隔的shell查找命令目錄列表,同時顯示了shell查找命令的順序
- PS1:shell命令行界面的主提示符
- PS2:shell命令行界面的次提示符
-
不是所有的默認環境變量都會在運行set命令時列出來,盡管這些時默認的環境變量,但不是它們都必須有一個值
5.5 設置PATH環境變量
PATH環境變量定義了命令行輸入命令的搜索路徑,如果找不到,就會產生一個錯誤
$ myprog
-bash: myprog: command not found $
- 1
- 2
- 3
- 解決上述問題的方法
- 保證PATH環境變量包含了所有存放應用的目錄
- 添加新的搜索目錄到現有的PATH環境變量,無需從頭定義
- 應用原來的PATH值,然后再給字符串添加新目錄進行了
PATH=$PATH:/home/user/test
- 1
- 通常將單點符也加入到PATH環境變量里
5.6 定位系統環境變量
- 啟動bash shell的3種方式
- 登錄時當默認登錄shell
- 作為非登錄shell的交互式shell
- 作為運行腳本的非交互式shell
5.6.1 登錄shell
- 當登錄Linux系統時,bash shell會作為登錄的shell啟動
- 登錄的shell從4個不同的啟動文件里讀取命令,下面是bash shell處理這些文件的次序
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bash_login
- $HOME/.profile
1. /etc/profile文件
- 這個文件時系統上默認的bash shell的主啟動文件,只要登陸了Linux系統,bash就會執行該文件中的命令
- 不同的Linux發行版文件里的存放着不同的命令 - 文件中最后有一行:export PATH USER LOGNAME MAIL HOSTNAME …:保證這些環境變量能在所有登錄這個shell創建的子進程中都有效
- 文件還有個復雜的特性:有個for語句逐一訪問位於/etc/profile.d目錄中的每個文件
- 它為Linux系統提供了一個集中存放用戶登錄時要執行的應用專屬的啟動文件的地方
- 大部分應用都會創建兩個啟動文件
- 一個給bash shell的(使用.sh擴展)
- 一個給c shell的(使用.csh擴展)
- lang.csh和.lang.sh文件會嘗試去判斷系統上所采用的默認語言文字集,然后正確地設置LANG環境變量
2. $HOME目錄下的啟動文件
- 剩下3個的啟動文件都起着同樣的作為:提供一個用戶專屬的啟動文件來定義用戶專有的環境變量
- 這3個啟動文件都是以點開頭的,是隱藏的文件
- 它們在用戶的HOME目錄下,所以每個用戶都可以編輯這些文件並添加自己的環境變量來給他們啟動的每個bash shell會話用
- .bash_forfile啟動文件作用:
- 先去檢查HOME目錄中是否還有一個叫.bashrc的啟動文件,有則先執行里面的命令
- 下一步,啟動文件將一個目錄加到了PATH環境變量,在HOME目錄下提供了一個放置可執行文件的通用位置
交互式shell
如果啟動的shell不是登錄系統時啟動的shell,該shell就是交互式shell
- 如果bash shell是作為交互式shell,他就不回去訪問/etc/profile文件,而會去用戶的HOME目錄檢查.bashrc是否存在
- .bashrc文件的兩個作用:
- 查看/etc目錄下的共用bashrc文件
- 通用的/etc/bashrc啟動文件會被系統文件上每個啟動交互式shell會話的用戶執行
- 為用戶提供了一個定制自己的命令別名和私有腳本函數的地方
- 查看/etc目錄下的共用bashrc文件
- .bashrc文件的兩個作用:
- 默認的/etc/bashrc文件會設置一些環境變量,但是沒有執行export命令讓它們成為全局的
- 交互式shell的啟動文件只會在每次有新的交互式shell啟動的時候才運行,因此任何子shell都會自動執行這個交互式shell的啟動文件
5.6.3 非交互式shell
系統執行shell腳本時用的就是非交互式shell,不用擔心它沒有命令行提示符
但當每次在系統上運行腳本時仍要運行特定的啟動命令
- bash shell提供了BASH_ENV環境變量來處理這種情況
- 當shell啟動一個非交互式shell進程時,它會檢查這個環境變量來查看要執行的啟動文件,如果有指定的,shell會執行文件里的命令
- 在Linux發行版里,默認情況這個環境變量並未設置
可變數組
- 環境變量可以作為數組使用,數組是能夠存儲多個值得變量
- 這個值可按照單個值或整個數組來引用
- 要給多個環境變量設置多個值,可以把值放在括號里,值與值之間用空格分隔
$ mytest=(one two three four five) $
- 1
- 2
- 要引用一個單獨的數組元素,需要用代表它在數組中位置的數值索引值,數值要用括號括起來
$ echo $(mytest[2]) three $
- 1
- 2
- 3
- 要顯示整個數組變量,可用星號作為通配符放在索引值的位置
$ echo ${mytest[*]}
one two three four five $
- 1
- 2
- 3
- 改變某個索引值位置的值
$mytest[2]=seven $echo ${mytest[*]} one two seven four five $
- 1
- 2
- 3
- 4
- 刪除數組中的元素:unset,但注意一些問題
$ unset mytest[2] $ echo ${mttest[*]} one two four five $ echo ${mytest[2]} $ echo ${mytest[3]} four $
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 刪除整個數組:unset + 數組名
$ unset mytest $ echo ${mytest[*]} $
- 1
- 2
- 3
- 4
5.8 使用命令別名
- 命令別名允許為通用命令(和他們的參數一起)創建一個別名
- 查看已有的別名列表:alias -p
- 用alias定義自己的用戶別名,一旦定義了別名,就可以在任何時候在shell中使用,包括shell腳本
$ alias li='ls -il' $ li ... $
- 1
- 2
- 3
- 4
- 命令別名的行為和定義局部環境變量差不多,只在定義它的shell進程中有效
- 解決方法:在$HOME/,bashrc啟動文件中定義,因為bash shell作為交互式shell時總會讀取這個文件