環境變量詳解


一、什么是環境變量

1、百科上的解釋

環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數,如:臨時文件夾位置和系統文件夾位置等。環境變量是在操作系統中一個具有特定名字的對象,它包含了一個或者多個應用程序所將使用到的信息。

2、自己的理解:

“環境”可以理解為操作系統,比如Linux、Windows。在操作系統中我們可以安裝各種軟件,比如說安裝了QQ。當我們想打開QQ時,需要找到QQ.EXE,雙擊打開,如果QQ.EXE隱藏的比較深,尋找起來很費勁,有沒有其他簡單的方式呢?當然是有的,我們可以將它添加到系統支持的Path變量中,該變量指向QQ.EXE所在的位置,下次要打開QQ.EXE時,直接輸入QQ就可以打開了(通過操作系統命令行模式)。

舉個例子,幫助理解下環境變量。我們在Windows操作系統裝安裝了一個QQ,打開它的方式有哪些?

(1)首先想到的是找到QQ的安裝目錄,找到QQ.EXE,雙擊打開。

(2)第一種方式是通過界面操作,我們還可以通過命令行操作,首先要知道QQ.EXE的位置,比如在“D:\SoftInstallPackage\QQ\Bin”,QQ的應用程序名稱為“QQ.EXE”,那么我們打開powershell,先切換到QQ.EXE所在的目錄,然后執行操作如下:

(3)以上兩種方式都要記住QQ.EXE所在的目錄,每次打開都需要找到相應的目錄,比較麻煩,能不能在powershell中直接輸入QQ.EXE就能執行,而不是每次都進入QQ的安裝目錄再啟動,這個時候可以通過配置系統環境變量Path來實現。右擊“我的電腦”,選擇“屬性”,在打開窗口中點擊左邊的“高級系統設置”,出現“系統屬性”窗口,在“高級”選項卡下面點擊“環境變量”。

編輯系統變量名“Path”,在“Path”編輯面板中新增QQ的安裝目錄:D:\SoftInstallPackage\QQ\Bin,如圖:

確定保存后,再回到命令窗口,不管在任何目錄下,你只要輸入QQ的命令,qq就會啟動。

 

 (4)QQ快捷圖標的方式打開QQ,為什么通過QQ快捷圖標就能夠打開QQ.EXE?其實很簡單,就是通過添加環境變量的方式實現的,和第三個方式的原理一樣,只不過執行的時候是通過界面操作(即點擊快捷圖標)。

3、總結

通過上邊的例子我們基本就能理解環境變量是干嘛的了,怎么更好的去描述他呢?我們把百科的解釋變通下:環境變量是操作系統(可以將操作系統想象成方法Fun(object 環境變量))中的參數,傳入不同的參數,可以讓操作系統(方法)做出不同的響應。即環境變量==操作系統這個大環境下的指令,該指令是人為指定的。

二、為什么要設置環境變量

在第一部分就詳細的闡述了環境變了,也能從中感受到了環境變量的作用,這里我們根據百科中的闡述解析下:

設置參數

設置參數就是人為指定Path,下次啟動某個軟件或者執行某個命令的時候就會方便很多,提高工作效率。

軟件共用

比方說我們在計算機上安裝雙系統,C盤安裝Windows XP,D盤安裝Windows 7。在XP系統上安裝的軟件無法在Windows7系統中使用,一般情況下我們都會在Windows7系統中在安裝一次該軟件。其實還有更好的方式,就是利用環境變量,即在兩個系統中都指定該軟件的環境變量,那么只需要在其中的一個系統中安裝一次,兩個系統中都可以使用。

系統運行

接着上邊軟件公用說,為什么在Windows XP中安裝了的軟件在Windows 7下無法運行呢(綠色軟件除外,綠色軟件不需要在操作系統中寫入配置,就是一個封裝好的exe,所以能夠共用)?原因是安裝軟件時往往須要向系統目錄中復制某些文件,而使用另外一個系統時會由於缺少這些文件而無法運行。因此,我們可以通過設置環境變量的方法來解決這個問題,即通過配置環境變量,指定軟件的安裝目錄,那么在兩個系統上打開該軟件的時候,都會到該安裝目錄下打開。

三、Windows操作系統如何配置環境變量

打開控制面板-系統和安全-系統-高級系統設置-高級-環境變量,如下圖:

 

 打開環境變量編輯框,可以看到,環境變量分為用戶變量和系統變量,如下圖

 

在系統變量中找到Path一欄 ,打開新增你想新增的變量

 

 保存之后就可以了,上邊提到環境變量分為用戶變量和系統變量,他們的關系是什么樣的呢?環境變量包括系統變量和用戶變量,我們知道一個Windows系統可以指定多個用戶,每個用戶都可以配置屬於自己的變量,這樣的變量就是用戶變量,每個用戶擁有不同的用戶變量,不同用戶的用戶變量之間是並列的,也是互不干擾的。任何系統用戶都在用系統變量,因此如果系統變量變化了,每個系統用戶都將受到影響。他們的關系如下圖所示:

 

 四、Linux系統環境變量

在 Linux 系統中,有環境變量和 Shell 變量這兩種變量。環境變量是在程序及其子程序中全局可用的,常常用來儲存像默認的文本編輯器或者瀏覽器,以及可執行文件的路徑等等這樣的信息。而 Shell 變量僅在當前 Shell 中可用,可以用來存儲當前用戶的 ID 等信息。

1、環境變量

環境變量是以鍵值對的形式實現的,是在整個系統范圍內都可用的變量,並由所有派生的子進程和 Shell 繼承。而環境變量的名稱是區分大小寫的,且通常以大寫的形式命名

單個值的環境變量看起來是這樣的:

KEY=value1

如果你想要將多個值賦予環境變量,則通常用冒號 ( : ) 作為分隔符。每一對鍵值對最終看起來是這樣子的:

KEY=value1:value2:value3

如果要賦予環境變量的值包含空格,則需要使用引號:

KEY="value with spaces"

 

2、Shell 變量

Shell 變量是專門用於設置或定義它們的 Shell 中的變量。每個 Shell ,例如 zsh 和 bash ,都有一組自己內部的 Shell 變量。它們通常用於跟蹤臨時數據,比如當前工作目錄,而用法則與環境變量相同。

如果你想讓 Shell 變量作為全局變量使用,可以使用 export 指令:

$ export MYVAR=lxlinux.net
$ echo $MYVAR
lxlinux.net
$ env | grep MYVAR
MYVAR=lxlinux.net

3、常見的環境變量

變量名 含義
TERM 這指定運行 Shell 時要模擬的終端類型。可以針對不同的操作需求模擬不同的硬件終端。不過,你通常不需要管這個變量。
USER 當前登錄的用戶
PWD 當前的工作目錄
OLDPWD 上一個工作目錄,這個變量由 Shell 保存,以便通過執行 cd - 切換回上一個工作目錄。
LS_COLORS 這定義了 ls 指令的顏色輸出代碼,用於向 ls 指令添加顏色輸出。這通常用於區分不同的文件類型並使用戶對文件類型等信息一目了然。
MAIL 當前用戶郵箱的路徑
PATH 系統在查找指令時會檢查的目錄列表。當用戶輸入一個指令時,系統將按此目錄列表的順序檢查目錄,以尋找相應的可執行文件。
LANG 當前的語言和本地化設置,包括字符編碼。
HOME 當前用戶的主目錄
_ 上一個被執行的指令

4、常見的 Shell 變量

變量名 含義
BASHOPTS 執行 bash 時所啟用的選項列表,這對於確定 Shell 環境是否按照預期的方式運行很有幫助。
BASH_VERSION 人類可讀格式的正在執行的 bash 版本
BASH_VERSINFO 機器可讀格式的正在執行的 bash 版本
COLUMNS 用於設置繪制到屏幕上的輸出信息的寬的列數
DIRSTACK pushd 和 popd 命令可用的目錄堆棧。
HISTFILESIZE 存儲到文件中的命令歷史記錄的行數。默認為 ~/.bash_history 文件的行數。
HISTSIZE 內存中允許存儲的命令歷史記錄的行數,即 histroy 命令所能打印出來的行數。
HOSTNAME 計算機的主機名
IFS 內部字段分隔符,用於分隔命令行上的輸入。 默認以空格作為分隔符。
PS1 定義主命令提示符。 這用於定義啟動 Shell 會話時命令提示符的外觀。而 PS2 用於聲明跨越多行的命令的命令提示符。
SHELLOPTS 可以用 set 命令設置的 Shell 選項。
UID 當前用戶的 UID (用戶 ID)

5、查看 Shell 變量與環境變量

在 Linux 系統中,有以下幾種命令可以讓你查看環境變量:

env — 該命令可以讓你在自定義的環境中運行程序,並且不需要改變當前的環境。當不帶參數使用 env 命令時,它會打印出當前的環境變量列表。

printenv — 可以打印出所有的或者指定的環境變量。

set — 該命令可以設置或者刪除 Shell 變量。當不帶參數使用 set 命令時,它將打印出包括環境變量與 Shell 變量在內的所有變量以及 Shell 函數的列表。

默認狀態下,env 和 printenv 的功能是完全相同的:

$ printenv 
SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=C.UTF-8
XDG_SESSION_ID=5
USER=alvin
MYVAR=lxlinux.net
PWD=/home/alvin
HOME=/home/alvin
SSH_CLIENT=10.0.2.2 37182 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/alvin
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=alvin
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

只有在更具體的功能上才能體現出 env 命令與 printenv 命令的區別。例如,使用 printenv 命令,你可以請求單個變量的值:

$ printenv SHELL
/bin/bash
$ printenv HOME
/home/alvin
$ printenv MYVAR
lxlinux.net

env 命令可通過將一組變量傳遞給命令來修改程序運行的環境:

env MYVAR=lxlinux.net command_to_run command_options

printenv 與 env 命令只能打印出環境變量,而如果你想打印出所有變量或者 Shell 函數的列表,你可以使用 set 指令。

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
COLUMNS=140
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/alvin/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/alvin
HOSTNAME=ubuntu-bionic
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=35
LOGNAME=alvin
.....

6、設置Shell變量與環境變量

Linux 系統中可以設置環境變量的命令有以下幾種:

set — 該命令可以設置或者取消設置 Shell 變量。當不帶參數使用 set 命令時,它將打印出包括環境變量與 Shell 變量在內的所有變量以及 Shell 函數的列表。

unset — 該命令可以刪除 Shell 變量以及環境變量。

export — 該命令可以設置環境變量。

為了更好地理解 Shell 變量和環境變量之間的區別,我們先從設置 Shell 變量開始講,然后再講環境變量。先從在當前會話中定義一個 Shell 變量開始:

$ MYVAR=lxlinux

你可以用 echo $MYVAR 來驗證變量是否已設置:

$ echo $MYVAR
lxlinux

使用 printenv 命令檢驗該變量是否為環境變量:

$ printenv MYVAR

沒有輸出返回,這就意味着 MYVAR 變量並不是環境變量。

export 命令可以用來設置環境變量。要創建環境變量,只需用 export 命令將 Shell 變量導出為環境變量:

$ export MYVAR

你可以用以下語句檢驗:

$ printenv MYVAR
lxlinux

當然,你也可以只用一行代碼來設置環境變量:

$ export MYNEWVAR="My New Variable"

但是以這種方式創建的環境變量只能用於當前會話,如果你打開一個新的 Shell 會話,或者退出登陸,所有的變量都將會丟失。

我們也可以將環境變量還原為 Shell 變量,或者將其完全刪除:MYVAR 變量被定義為環境變量,我們可以通過輸入以下代碼將其還原為 Shell 變量:

$ export -n MYVAR

這樣,MYVAR 變量就不再是環境變量了,但依然還是 Shell 變量。無論是 Shell 變量還是環境變量,想要完全刪除變量,都可以使用 unset 命令來刪除:

$ unset MYVAR

可以通過以下語句來驗證 MYVAR 變量已經刪除:

$ echo $MYVAR

由於變量已經刪除了,所以沒有任何返回。

7、環境變量的持久化

許多程序都需要使用環境變量來決定具體的執行方式,但是,我們並不希望每次啟動新的 Shell 會話時都必須重新設置重要的變量,因此我們需要將重要的環境變量寫入配置文件中。Shell 會話有不同的啟動方式,比如,連接到終端的交互式 Shell 與未連接到終端的非交互式 Shell,還有登錄式 Shell 與非登錄式 Shell, 而 bash Shell 會根據會話不同的啟動方式而讀取不同的配置文件。但是,在大多數 Linux 發行版中,當你啟動一個新的 Shell 會話時,一般都會從以下文件中讀取環境變量:

/etc/environment — 使用此文件來設置系統范圍內可用的環境變量。

/etc/profile — 每當 bash 登錄 Shell 時,都會加載此文件中設置的變量。

~/.bashrc — 每個用戶特定的 Shell 配置文件。例如, 如果你使用的是Bash,就可以在其中聲明變量。

如果要將新的環境變量加載到當前的 Shell 會話中,可以使用source命令:

$ source ~/.bashrc

如果你想要設置環境變量,你就可以考慮將其添加到 /etc/profile 、/etc/bash.bashrc 或 /etc/environment 文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM