很多程序和腳本都通過環境變量來獲取系統信息、存儲臨時數據和配置信息。
6.1 什么是環境變量:
bash shell用一個叫環境變量(environment variable)的特性來存儲有關shell會話和工作環境的信息。
這項特性允許在內存中存儲數據,以便程序能輕松訪問到它們。
在bash shell中,分兩類:
全局變量:對於shell會話和所有生成的子shell都是可見的
局部變量:只對創建的它們的shell可見
6.1.1全局環境變量
查看全局變量, $env $printenv
查看某個全局變量:$printenv HOME 或者
$echo $PATH // $后面接變量名。能讓變量作為命令行參數
比如:ls $HOME 相當於 ls /home/xiaochongyong
6.1.2 局部環境變量
只在定義它們的進程中可見。
可分為:標准的局部變量 和 用戶自定義的局部變量
set:顯示為某個特定進程設置的所有環境變量(包括全局,標准局部,自定義局部),還會按照字母排序。
6.2 設置自定義變量。大小寫敏感的
6.2.1 設置局部自定義變量:盡量用小寫
$my_variable=hello
$echo $ my_variable
$my_variable="hello xcy" // 兩個詞時這么寫,加"" 。=邊上還不能有空格
$echo $ my_variable
父shell中寫了,子shell不一定能用。反之也是。
6.2.1 設置全局環境變量。
設定全局變量的進程所創建的子進程中,該變量都是可見的。
創建方法:
(1)
$my_variable=hello // 創建環境變量
$export my_variable // 導出到全局變量中
(2)export $my_variable=new_hello // 這樣是更改值
子shell無法改到父shell中全局變量的值。只在當前子shell有效。
6.3刪除環境變量
$unset my_variable
子shell中刪除了,無法反應到父shell中去。
6.4 默認的shell環境變量。
默認情況下,bash shell中會用一些特定的環境變量來定義系統環境。
這些變量在Linux系統上都已經設置好了。
6.5 設置PATH環境變量
PATH:定義了用於進行命令和程序查找的目錄。
echo $PATH 目錄以冒號隔開。
可以把新的搜索目錄添加到現有的PATH環境變量中。比如:
gcc hello.c -o xcy
一般只能 ./xcy 運行
但是加了環境變量之后就可以運行了。
但是切換到別的目錄還是不行。除非這么加
對PATH的修改只能持續到退出或重啟系統,不能一直持續。
6.6 定位系統環境變量
登入系統啟動一個bash shell時,默認情況下bash會在幾個文件中查找命令。這種文件叫做啟動文件或環境文件。
bash檢查的啟動文件取決於啟動bash shell 的方式。啟動方式有三種:
1.登錄shell:登錄系統時,bash shell會作為登錄shell啟動。會從5個啟動文件里面讀取命令。
(1)/etc/profile (系統默認主啟動文件,系統上每個用戶登錄都會執行這個啟動文件)
(2)HOME/.bash_profile HOME/.bashrc HOME/.bash_login HOME/.profile
這4個是針對用戶的,提供一個用戶專屬的啟動文件來定義該用戶所用到的環境變量。
大多數Linux發行版只用到這四個文件中的一兩個。不一定每個用戶都有所有文件。
shell、按照下面的順序運行第一個被找到的文件,余下的被忽略:
HOME/.bash_profile
HOME/.bash_login
HOME/.profile
注意上面沒有HOME/.bashrc 。
HOME/.bashrc 這個文件通常通過其他文件運行。
我的電腦里面只有 HOME/.profile
紅色部分表示檢查HOME目錄是不是有一個.bashrc,如果有就會先執行.bashrc里面的命令
2.交互式shell進程
不是系統登錄時啟動的,比如在終端下直接運行bash。這個就是交互式shell進程。
這種進程不會訪問/etc/profile,只會檢查HOME下的.bashrc
.bashrc有兩個作用:1.查看/etc目錄下通用的bashrc文件、2.為用戶提供一個定制自己命令別名和私有腳本函數的地方
3.非交互式shell
系統執行shell腳本時用的就是這種shell。
沒有命令行提示符。
bash shell提供BASH_ENV環境變量。當啟動非交互式shell時,會檢查BASH_ENV來查看要執行的啟動文件。如果有,shell會執行里面的命令。這通常包含shell腳本變量設置。
我的電腦沒有BASH_ENV值。是如何處理的呢?通過繼承父shell的導出過的變量。
比如:父shell是登錄shell。在/etc/profile /etc/profile.d/*.sh HOME/.bashrc 文件中設置並導出了環境變量,用於執行腳本的子shell能繼承這些變量。、
父shell未導出的變量是局部變量,子shell無法繼承。
6.6.4 環境變量持久化
對於全局環境變量,/etc/profile 在升級之后就會沒有。可以在/etc/profile.d 目錄下創建一個.sh結尾的文件,把所有新的或修改過的全局變量放在這個文件中
存儲個人永久性bash shell的地方是HOME/.bashrc。
比如之前的給命令取別名,如果放在這里就可以永遠使用了。
6.7 數組變量。
環境變量可以是數組(從0開始)。比如:
這個用的很少。