一、概述
Linux 系統(tǒng)中,很多程序和腳本通過環(huán)境變量來獲取系統(tǒng)信息、存儲臨時數(shù)據(jù)和配置信息,了解去哪里設(shè)置相應(yīng)的環(huán)境變量很重要。
本文總結(jié)了Linux 環(huán)境變量:它們存儲在哪里、如何使用,以及如何創(chuàng)建自己的環(huán)境變量,最后會以數(shù)組變量的用法作結(jié)。
二、什么是環(huán)境變量
環(huán)境變量允許在內(nèi)存中存儲數(shù)據(jù),以便 shell 中運行的程序或腳本能夠輕松訪問到這些數(shù)據(jù)。這也是存儲持久數(shù)據(jù)的一種簡便方法。bash shell 中有兩種環(huán)境變量:
- 全局變量
- 局部變量
2.1 全局環(huán)境變量
全局環(huán)境變量對于 shell 會話和所有生成的子 shell 都是可見的。局部環(huán)境變量則只對創(chuàng)建它的 shell 可見。如果程序創(chuàng)建的子 shell 需要獲取父 shell 信息,那么全局環(huán)境變量就能派上用場了。
系統(tǒng)環(huán)境變量基本上會使用全大寫字母,以區(qū)別于用戶自定義的環(huán)境變量??梢允褂?env
命令或printenv
命令來查看全局變量:>wkd@ubuntu:~$ printenv XDG_SESSION_ID=4 SHELL=/bin/bash TERM=xterm-256color SSH_CLIENT=192.168.2.100 2132 22 SSH_TTY=/dev/pts/10 USER=wkd JRE_HOME=/opt/jvm/jdk1.8.0_271/jre PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games MAIL=/var/mail/wkd QT_QPA_PLATFORMTHEME=appmenu-qt5 PWD=/home/wkd JAVA_HOME=/opt/jvm/jdk1.8.0_271 LANG=en_US.UTF-8 HOME=/home/wkd SHLVL=2 UNITY_PANEL_TRAY_DISABLE= LOGNAME=wkd CLASSPATH=.:/opt/jvm/jdk1.8.0_271/lib:/opt/jvm/jdk1.8.0_271/jre/lib LESSOPEN=| /usr/bin/lesspipe %s XDG_RUNTIME_DIR=/run/user/1000 LESSCLOSE=/usr/bin/lesspipe %s %s OLDPWD=/home/lu _=/usr/bin/printenv wkd@ubuntu:~$
printenv
命令可以顯示指定的環(huán)境變量的值:wkd@ubuntu:~$ printenv HOME /home/wkd wkd@ubuntu:~$
echo
命令也可以顯示變量的值。在引用某個環(huán)境變量時,必須在該變量名前加上美元符號($
):wkd@ubuntu:~$ echo $HOME /home/wkd wkd@ubuntu:~$
2.2 局部環(huán)境變量
局部環(huán)境變量只能在定義它的進程中可見。set 命令可以顯示特定進程的所有環(huán)境變量,既包括局部變量、全局變量,也包括用戶自定義變量,下面演示set命令使用,由于輸出太多,使用
grep
過濾,只顯示帶HOME的環(huán)境變量:wkd@ubuntu:~$ set | grep HOME HOME=/home/wkd JAVA_HOME=/opt/jvm/jdk1.8.0_271 JRE_HOME=/opt/jvm/jdk1.8.0_271/jre wkd@ubuntu:~$
三、設(shè)置用戶自定義變量
3.1 設(shè)置局部用戶自定義變量
啟動 bash shell(或者執(zhí)行 shell 腳本)之后,就能創(chuàng)建僅對該 shell 進程可見的局部用戶自定義變量。格式是:
變量名=變量值
,值可以是數(shù)值或字符串。讀取變量值需要使用美元符號$
下面的交互式shell的演示:wkd@ubuntu:~$ my_var=1234a wkd@ubuntu:~$ echo $my_var 1234a wkd@ubuntu:~$
如果用于賦值的字符串包含空格,則必須用
單引號
或雙引號
來界定該字符串的起止:wkd@ubuntu:~$ my_var="hello world" wkd@ubuntu:~$ echo $my_var hello world wkd@ubuntu:~$
如果沒有引號,則 bash shell 會將下一個單詞①( World)視為另一個要執(zhí)行的命令。
注意,你定義的局部變量用的是小寫字母,而系統(tǒng)環(huán)境變量用的都是大寫字母。在變量名、等號和值之間沒有空格。局部變量可以通過
set
命令看到,而通過env
或printenv
命令無法看到:wkd@ubuntu:~$ set | grep my_var my_var='hello world' wkd@ubuntu:~$ env | grep my_var wkd@ubuntu:~$ printenv | grep my_var
3.2 設(shè)置全局環(huán)境變量
全局環(huán)境變量在設(shè)置該變量的父進程所創(chuàng)建的子進程中都是可見的。
創(chuàng)建方法:先創(chuàng)建局部變量,然后再使用export
導(dǎo)出到全局環(huán)境中。
用前面的my_var
變量舉例,前面設(shè)置成局部變量 ,用env
命令看不到,如果導(dǎo)出到全局環(huán)境中,env
命令就可以查看了:wkd@ubuntu:~$ export my_var wkd@ubuntu:~$ env | grep my_var my_var=hello world wkd@ubuntu:~$
在現(xiàn)實中設(shè)置全局變量,常設(shè)置變量和導(dǎo)出變量放在同一語句,如:
export my_var="hello world"
。
全部變量在子shell中可見,但子 shell 無法修改父 shell 中全局環(huán)境變量的值,見如下例子:
3.3 刪除環(huán)境變量
在環(huán)境變量名(沒有加
$
)前加上unset
,可以刪除該環(huán)境變量:
和修改變量一樣,在子 shell 中刪除全局變量后,無法將效果反映到父 shell 中。
四、默認的 shell 環(huán)境變量
在默認情況下, bash shell 會用一些特定的環(huán)境變量來定義系統(tǒng)環(huán)境。
這些變量在你的 Linux系統(tǒng)中都已設(shè)置好,只管放心使用就行了。由于 bash shell 源自最初的 Unix Bourne shell,因此也保留了 Unix Bourne shell 中定義的那些環(huán)境變量。
下表列出了 bash shell 與 Unix Bourne shell 兼容的環(huán)境變量:
變量 | 描述 |
---|---|
CDPATH | 以冒號分隔的目錄列表,作為 cd 命令的搜索路徑 |
HOME | 當(dāng)前用戶的主目錄 |
IFS | shell 用來將文本字符串分割成字段的若干字符 |
當(dāng)前用戶收件箱的文件名( bash shell 會檢查這個文件來確認有沒有新郵件) | |
MAILPATH | 以冒號分隔的當(dāng)前用戶收件箱的文件名列表( bash shell 會檢查列表中的每個文件來確認有沒有新郵件) |
OPTARG | 由 getopt 命令處理的最后一個選項參數(shù) |
OPTIND | 由 getopt 命令處理的最后一個選項參數(shù)的索引 |
PATH | shell 查找命令時使用的目錄列表,以冒號分隔 |
PS1 | shell 命令行的主提示符 |
PS2 | shell 命令行的次提示符 |
除了默認的 Bourne 環(huán)境變量, bash shell 還提供一些自有的變量,不是所有的默認環(huán)境變量都會在 set 命令的輸出中列出。如果用不到,默認環(huán)境變量并不要求必須有值:
變量 | 描述 |
---|---|
BASH | bash shell 當(dāng)前實例的完整路徑名 |
BASH_ALIASES | 關(guān)聯(lián)數(shù)組,包含當(dāng)前已設(shè)置的別名 |
BASH_ARGC | 數(shù)組變量,包含傳入函數(shù)或 shell 腳本的參數(shù)個數(shù) |
BASH_ARCV | 數(shù)組變量,包含傳入函數(shù)或 shell 腳本的參數(shù) |
BASH_ARCV0 | 包含 shell 的名稱或 shell 腳本的名稱(如果在腳本中使用的話) |
BASH_CMDS | 關(guān)聯(lián)數(shù)組,包含 shell 已執(zhí)行過的命令的位置 |
BASH_COMMAND | 正在執(zhí)行或?qū)⒁獔?zhí)行的 shell 命令 |
BASH_COMPAT | 指定 shell 兼容級別的值 |
BASH_ENV | 如果設(shè)置的話, bash 腳本會在運行前先嘗試運行該變量定義的啟動文件 |
BASH_EXECUTION_STRING | 使用 bash 命令的-c 選項傳遞過來的命令 |
BASH_LINENO | 數(shù)組變量,包含當(dāng)前正在執(zhí)行的 shell 函數(shù)在源文件中的行號 |
BASH_LOADABLE_PATH | 以冒號分隔的目錄列表, shell 會在其中查找可動態(tài)裝載的內(nèi)建命令 |
BASH_REMATCH | 只讀數(shù)組變量,在使用正則表達式的比較運算符=~進行肯定匹配( positive match)時,包含整個模式及子模式所匹配到的內(nèi)容 |
BASH_SOURCE | 數(shù)組變量,包含當(dāng)前正在執(zhí)行的 shell 函數(shù)所在的源文件名 |
BASH_SUBSHELL | 當(dāng)前子 shell 環(huán)境的嵌套級別(初始值是 0) |
BASH_VERSINFO | 數(shù)組變量,包含 bash shell 當(dāng)前實例的主版本號和次版本號 |
BASH_VERSION | bash shell 當(dāng)前實例的版本號 |
BASH_XTRACEFD | 如果設(shè)置為有效的文件描述符( 0、 1、 2),則’set -x’調(diào)試選項生成的跟蹤輸出可被重定向。通常用于將跟蹤信息輸出到文件中 |
BASHOPTS | 當(dāng)前啟用的 bash shell 選項 |
BASHPID | 當(dāng)前 bash 進程的 PID |
CHILD_MAX | 設(shè)置 shell 能夠記住的已退出子進程狀態(tài)的數(shù)量 |
COLUMNS | bash shell 當(dāng)前實例所用的終端顯示寬度 |
COMP_CWORD | 變量 COMP_WORDS 的索引,其中包含當(dāng)前光標(biāo)的位置 |
COMP_LINE | 當(dāng)前命令行 |
COMP_POINT | 相對于當(dāng)前命令起始處的光標(biāo)位置索引 |
COMP_KEY | 用來調(diào)用 shell 函數(shù)補全功能的最后一個按鍵 |
COMP_TYPE | 一個整數(shù)值,指明了用以完成 shell 函數(shù)補全所嘗試的補全類型 |
COMP_WORDBREAKS | Readline 庫中用于單詞補全的分隔符 |
COMP_WORDS | 數(shù)組變量,包含當(dāng)前命令行所有單詞 |
COMPREPLY | 數(shù)組變量,包含由 shell 函數(shù)生成的可能的補全代碼 |
COPROC | 數(shù)組變量,包含用于匿名協(xié)程 I/O 的文件描述符 |
DIRSTACK | 數(shù)組變量,包含目錄棧的當(dāng)前內(nèi)容 |
EMACS | 設(shè)置為’t’時,表明 emacs shell 緩沖區(qū)正在工作,行編輯功能被禁止 |
EPOCHREALTIME | 包含自 Unix 紀元時( 1970 年 1 月 1 日 00:00:00 UTC)以來的秒數(shù),包括微秒 |
EPOCHSECONDS | 包含自 Unix 紀元時( 1970 年 1 月 1 日 00:00:00 UTC)以來的秒數(shù),不包括微秒 |
ENV | 如果設(shè)置,則會在 bash shell 腳本運行之前先執(zhí)行已定義的啟動文件(僅當(dāng) bash shell 以 POSIX 模式被調(diào)用時) |
EUID | 當(dāng)前用戶的有效用戶 ID(數(shù)字形式) |
EXECIGNORE | 以冒號分隔的過濾器列表,在使用 PATH 搜索命令時,用于決定要忽略的可執(zhí)行文件(比如共享庫文件) |
FCEDIT | 供 fc 命令使用的默認編輯器 |
FIGNORE | 在進行文件名補全時可以忽略后綴名列表,以冒號分隔 |
FUNCNAME | 當(dāng)前正在執(zhí)行的 shell 函數(shù)的名稱 |
FUNCNEST | 當(dāng)設(shè)置成非 0 值時,表示所允許的函數(shù)最大嵌套級數(shù)(一旦超出,當(dāng)前命令即被終止) |
GLOBIGNORE | 以冒號分隔的模式列表,定義了在進行文件名擴展時可以忽略的一組文件名 |
GROUPS | 數(shù)組變量,包含當(dāng)前用戶的屬組 |
histchars | 控制歷史記錄擴展,最多可有 3 個字符 |
HISTCMD | 當(dāng)前命令在歷史記錄中的編號 |
HISTCONTROL | 控制哪些命令留在歷史記錄列表中 |
HISTFILE | 保存 shell 歷史記錄的文件名(默認是.bash_history) |
HISTFILESIZE | 歷史記錄文件( history file)能保存的最大命令數(shù)量 |
HISTIGNORE | 以冒號分隔的模式列表,用于決定忽略歷史文件中的哪些命令 |
HISTSIZE | 能寫入歷史記錄列表( history list)的最大命令數(shù)量 |
HISTTIMEFORMAT | 如果設(shè)置且不為空,則作為格式化字符串,用于打印 bash 歷史記錄中命令的時間戳 |
HOSTFILE | shell 在補全主機名時讀取的文件名 |
HOSTNAME | 當(dāng)前主機的名稱 |
HOSTTYPE | 字符串,用于描述當(dāng)前運行 bash shell 的機器 |
IGNOREEOF | shell 在退出前必須連續(xù)接收到的 EOF 字符數(shù)量(如果該值不存在,則默認為 1) |
INPUTRC | Readline 的初始化文件名(默認為.inputrc) |
INSIDE_EMACS | 僅當(dāng)進程在 Emacs 編輯器的緩沖區(qū)中運行時才設(shè)置,并且可以禁用行編輯(行編輯的禁用也取決于 TERM 變量的值) |
LANG | shell 的語言環(huán)境種類( locale category) |
LC_ALL | 定義語言環(huán)境種類,能夠覆蓋 LANG 變量 |
LC_COLLATE | 設(shè)置字符串排序時采用排序規(guī)則 |
LC_CTYPE | 決定如何解釋出現(xiàn)在文件名擴展和模式匹配中的字符 |
LC_MESSAGES | 決定在解釋前面帶有$的雙引號字符串時采用的語言環(huán)境設(shè)置 |
LC_NUMERIC | 決定格式化數(shù)字時采用的語言環(huán)境設(shè)置 |
LC_TIME | 決定格式化日期和時間時采用的語言環(huán)境設(shè)置 |
LINENO | 當(dāng)前正在執(zhí)行的腳本語句的行號 |
LINES | 定義了終端上可見的行數(shù) |
MACHTYPE | 用“CPU–公司–系統(tǒng)”( CPU-company-system)格式定義的系統(tǒng)類型 |
MAILCHECK | shell 應(yīng)該多久檢查一次新郵件(以秒為單位,默認為 60 秒) |
MAPFILE | 數(shù)組變量,當(dāng)未指定數(shù)組變量作為參數(shù)時,其中保存了 mapfile 所讀入的文本 |
OLDPWD | shell 先前使用的工作目錄 |
OPTERR | 如果設(shè)置為 1,則 bash shell 會顯示 getopts 命令產(chǎn)生的錯誤 |
OSTYPE | 定義了 shell 所在的操作系統(tǒng) |
PIPESTATUS | 數(shù)組變量,包含前臺進程的退出狀態(tài) |
POSIXLY_CORRECT | 如果設(shè)置的話, bash 會以 POSIX 模式啟動 |
PPID | bash shell 父進程的 PID |
PROMPT_COMMAND | 如果設(shè)置的話,在顯示命令行主提示符之前執(zhí)行該命令 |
PROMPT_DIRTRIM | 用來定義使用提示符字符串\w 和\W 轉(zhuǎn)義時顯示的拖尾( trailing)目錄名的數(shù)量(使用一組英文句點替換被刪除的目錄名) |
PS0 | 如果設(shè)置的話,指定了在輸入命令之后、執(zhí)行命令之前由交互式 shell 顯示的內(nèi)容 |
PS3 | select 命令的提示符 |
PS4 | 在命令行之前顯示的提示符(如果使用了 bash 的-x 選項的話) |
PWD | 當(dāng)前工作目錄 |
RANDOM | 返回一個 0~ 32 767 的隨機數(shù)(對該變量的賦值可作為隨機數(shù)生成器的種子) |
READLINE_LINE | 當(dāng)使用 bind –x 命令時,保存 Readline 緩沖區(qū)的內(nèi)容 |
READLINE_POINT | 當(dāng)使用 bind –x 命令時,指明了 Readline 緩沖區(qū)內(nèi)容插入點的當(dāng)前位置 |
REPLY | read 命令的默認變量 |
SECONDS | 自 shell 啟動到現(xiàn)在的秒數(shù)(對其賦值會重置計數(shù)器) |
SHELL | bash shell 的完整路徑名 |
SHELLOPTS | 以冒號分隔的已啟用的 bash shell 選項 |
SHLVL | shell 的層級,每啟動一個新的 bash shell,該值增加 1 |
TIMEFORMAT | 指定了 shell 的時間顯示格式 |
TMOUT | select 命令和 read 命令在無輸入的情況下等待多久(以秒為單位,默認值為 0,表示一直等待) |
TMPDIR | 目錄名,保存 bash shell 創(chuàng)建的臨時文件 |
UID | 當(dāng)前用戶的真實用戶 ID(數(shù)字形式) |
五、
5.1 設(shè)置 PATH 環(huán)境變量
PATH
環(huán)境變量定義了用于查找命令和程序的目錄。當(dāng)外部命令或程序所在的位置包含在PATH
變量中,那么不不使用絕對路徑,shell 也可以找到該路徑,否則,會報錯command not found
。
下面是Ubuntu 系統(tǒng)的PATH
環(huán)境變量的值,目錄之間以冒號分隔:wkd@ubuntu:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
在
PATH
環(huán)境變量新增一個路徑,只需引用原來的 PATH 值,添加冒號(:
),然后再使用絕對路徑輸入新目錄即可,如:PATH=$PATH:/home/wkd/cmd
。
對于 PATH 變量的修改只能持續(xù)到退出或重啟系統(tǒng)。下一節(jié)會介紹如何永久保持環(huán)境變量的改動。文章來源:http://www.zghlxwxcb.cn/news/detail-524473.html
5.2
如果文章有幫助的話,點贊??、收藏?,支持一波,謝謝 ??????文章來源地址http://www.zghlxwxcb.cn/news/detail-524473.html
到了這里,關(guān)于【Linux | Shell命令】Linux 環(huán)境變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!