Linux命令之 -- export 设置/显示系统环境变量
文章目錄
- 一、命令介紹
- 二、export 的原理
- (一)什么是進程
- (二)父子進程關系
- (三)子 shell 如何訪問父 shell 的變量(export 實現原理)
- (四)父 shell 如何訪問子 shell 的變量
- (五)export 作用范圍
- 1. 為什么當前 shell 中執行 export 所產生的效果僅在本次會話中有效呢?
- 2. 如何設置永久的環境變
- 3. 為什么在 /etc/profile 文件中聲明定義的變量是永久有效的呢?
- 三、常用選項
- 四、命令示例
- (一)列出當前所有的環境變量
- (二)聲明定義環境變量
- (三)顯示某個環境變量的值
一、命令介紹
export 的基本作用就是將父 shell 中的局部變量設置為環境變量,使得該變量可以在子 shell 中使用。
export 命令用于將 shell 變量輸出為環境變量,或者將 shell 函數輸出為環境變量。
一個變量創建時,在它之后創建的 shell 進程是不知道的,而命令 export 則可以向后面的 shell 進程傳遞變量的值;同樣的,被調用執行的 shell 腳本是無權訪問調用者定義的變量的,除非這些變量已經被顯式地設置為可用,但是命令 export 可以傳遞變量的值給后繼腳本。
二、export 的原理
(一)什么是進程
進程是一個運行著的程序,是代碼的動態形式,進程有如下屬性:
- 獨立的內核堆棧
- 進程控制塊
- 獨立的存儲空間
由于每個進程有自己獨立的存儲空間,所以進程間的的數據是不可見的,進程間的交互需要用到進程間通信。所以在一個進程內的操作通常不會影響到另一個進程的內容,也不會被另一個進程所看到。每一個 shell 都是一個獨立的進程。
(二)父子進程關系
父子進程都是獨立的進程,父進程可以管理子進程,這種管理主要體現在三個方面:生、管、死。
“生”:父進程可以創建子進程。
“管”:命令 export 的操作就屬于管理。
“死”:父進程死則子進程必須死,子進程死對父進程沒有影響。
(三)子 shell 如何訪問父 shell 的變量(export 實現原理)
在父 shell 中執行一個子 shell(執行命令 bash 就是執行一個子 shell),會啟動一個子進程,即子 shell 是一個獨立于父 shell 的進程,因此父子 shell 的存儲空間是相互不可訪問的(即子 shell 無法訪問父 shell 中的變量),如果想讓子 shell 訪問父 shell 的變量就需要將該變量從父 shell 的獨立存儲空間復制到子 shell 的獨立存儲空間,子 shell 所看到的父進程的變量其實是自己進程空間的內容,而不是父進程的內容,只是該變量的名稱和值與父進程相同而已。而命令 export 就是將父進程空間的內容復制到子進程的存儲空間,也就是說命令 export 的作用就是將父進程的局部變量變成全局變量,即所謂變成環境變量。
(四)父 shell 如何訪問子 shell 的變量
父進程可以將自己的環境變量寫入到子進程的空間中,但是子進程無法將自己空間的數據寫入到父進程中(至少 export 命令做不到)。那么想要讓子 shell 中的變量在父 shell 可見,最好的辦法就是不要成為子 shell,即只將該 shell 中的內容導入到父 shell 中(即將被調用的腳本內容復制到父 shell 中直接執行),而不單獨執行該 shell 腳本文件。這樣用到的導入命令是 source。
(五)export 作用范圍
命令 export 可新增,修改或刪除環境變量,供后續執行的程序使用,但是 export 產生的效果僅在本次會話中有效。
舉例說明,將路徑 /opt/au1200_rm/build_tools/bin 追加到環境變量 PATH 中:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"1. 為什么當前 shell 中執行 export 所產生的效果僅在本次會話中有效呢?
看上述的命令可知環境變量 PATH 早已經聲明和定義過,這條指令是先獲取變量 PATH 的舊值再拼接新的路徑最后得到新的路徑字符串,再將此字符串賦值給變量 PATH,所以此條指令只是將當前進程中的棧內存的環境變量 PATH 重新賦值而已,并將其定義為可輸出的變量,這樣每次創建子進程時就可以將此變量復制到子進程的內存空間中。
當進程結束后,內存空間被釋放回收了,所以屬于該進程的變量自然也被回收了。當再次創建 shell 進程時,加載到新進程內存空間的環境變量 PATH 是從配置文件讀取的,相當于說環境變量 PATH 恢復原值了。
2. 如何設置永久的環境變
在 /etc/profile 文件中聲明定義環境變量,那么每次創建進程的時候,就都可以獲取到該變量的值。
[root@htlwk0001host ~]# vi /etc/profile在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"修改配置文件 /etc/profile 是對所有的用戶有效,建議修改用戶家目錄下的配置文件 .bashrc 或 .bash_profile,這兩個配置文件僅對當前登錄用戶有效。
注:在全局配置文件 /etc/profile 中,如果把變量定義成上述的語句,那么第一個進程創建時變量 $PATH 的取值必然為空,因為沒有父進程,所以談不上復制父進程的全局變量。第一個進程創建時先讀取 /etc/profile 文件,此時第一個進程的內存中根本不存在變量 $PATH,所以何來“舊值”替換。
3. 為什么在 /etc/profile 文件中聲明定義的變量是永久有效的呢?
我們每次打開一個命令窗口,就是創建一個 shell 進程,而且這個進程是父進程,會先讀取 /etc/profile 文件,所以每次創建進程的時候都可以獲取到 /etc/profile 文件里面的變量。
子進程不會讀取任何的配置文件,子進程的棧內存中的變量都是從父進程復制過來的,當然必須是標記為 “export” 的變量才會復制到子進程的內存空間中。
三、常用選項
| -f | 代表[變量名稱]中為函數名稱 |
| -n | 刪除指定的變量。變量實際上并未刪除,只是不會輸出到后續指令的執行環境中 |
| -p | 列出所有的 shell 賦予程序的環境變量 |
四、命令示例
(一)列出當前所有的環境變量
[root@htlwk0001host ~]# export -p declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/0/bus" declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000"(二)聲明定義環境變量
[root@linuxcool ~]# export MYENV=7注意:僅在當前登錄會話有效,退出后就失效了。
(三)顯示某個環境變量的值
[root@htlwk0001host ~]# echo $HOME /root總結
以上是生活随笔為你收集整理的Linux命令之 -- export 设置/显示系统环境变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称苹果已预订台积电3nm制程工艺今年
- 下一篇: Linux 命令之 wget -- 下载