一、什么是環境變量
1、百科上的解釋:
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 環境變量))中的參數,傳入不同的參數,可以讓操作系統(方法)做出不同的響應。即環境變量==操作系統這個大環境下的指令,該指令是人為指定的。
二、為什么要設置環境變量
在第一部分就詳細的闡述了環境變了,也能從中感受到了環境變量的作用,這里我們根據百科中的闡述解析下:
設置參數
軟件共用
系統運行
三、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 指令添加顏色輸出。這通常用於區分不同的文件類型並使用戶對文件類型等信息一目了然。 |
當前用戶郵箱的路徑 | |
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
文件中。