<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何設(shè)置與查看Linux系統(tǒng)中的環(huán)境變量?

          共 5390字,需瀏覽 11分鐘

           ·

          2020-08-17 19:32


          點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。


          大家好,我是良許。

          大家都知道,在 Linux 系統(tǒng)中,有環(huán)境變量Shell 變量這兩種變量。

          環(huán)境變量是在程序及其子程序中全局可用的,常常用來(lái)儲(chǔ)存像默認(rèn)的文本編輯器或者瀏覽器,以及可執(zhí)行文件的路徑等等這樣的信息。而 Shell 變量?jī)H在當(dāng)前 Shell 中可用,可以用來(lái)存儲(chǔ)當(dāng)前用戶(hù)的 ID 等信息。

          那么什么是環(huán)境變量,什么是 Shell 變量,該如何設(shè)置和查看這兩種變量呢?

          接下來(lái),讓良許為你解答:


          環(huán)境變量


          環(huán)境變量是以鍵值對(duì)的形式實(shí)現(xiàn)的,是在整個(gè)系統(tǒng)范圍內(nèi)都可用的變量,并由所有派生的子進(jìn)程和 Shell 繼承。而環(huán)境變量的名稱(chēng)是區(qū)分大小寫(xiě)的,且通常以大寫(xiě)的形式命名 ( MYVAR1, MYVAR2... )

          單個(gè)值的環(huán)境變量看起來(lái)是這樣的:

          KEY=value1

          如果你想要將多個(gè)值賦予環(huán)境變量,則通常用冒號(hào) ( : ) 作為分隔符。每一對(duì)鍵值對(duì)最終看起來(lái)是這樣子的:

          KEY=value1:value2:value3

          如果要賦予環(huán)境變量的值包含空格,則需要使用引號(hào):

          KEY="value with spaces"



          Shell變量


          Shell 變量是專(zhuān)門(mén)用于設(shè)置或定義它們的 Shell 中的變量。每個(gè) Shell ,例如 zsh 和 bash ,都有一組自己內(nèi)部的 Shell 變量。它們通常用于跟蹤臨時(shí)數(shù)據(jù),比如當(dāng)前工作目錄,而用法則與環(huán)境變量相同。

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

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



          常見(jiàn)的環(huán)境變量與 Shell 變量


          一些環(huán)境變量和 Shell 變量是非常有用的,并且經(jīng)常會(huì)被引用。以下是一些常見(jiàn)的,你以后可能會(huì)遇到的環(huán)境變量:

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

          除了以上這些環(huán)境變量,你也可能會(huì)經(jīng)常遇到以下這些 Shell 變量:

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



          查看 Shell 變量與環(huán)境變量


          在 Linux 系統(tǒng)中,有以下幾種命令可以讓你查看環(huán)境變量:

          env — 該命令可以讓你在自定義的環(huán)境中運(yùn)行程序,并且不需要改變當(dāng)前的環(huán)境。當(dāng)不帶參數(shù)使用 env 命令時(shí),它會(huì)打印出當(dāng)前的環(huán)境變量列表。

          printenv — 可以打印出所有的或者指定的環(huán)境變量。

          set — 該命令可以設(shè)置或者刪除 Shell 變量。當(dāng)不帶參數(shù)使用 set 命令時(shí),它將打印出包括環(huán)境變量與 Shell 變量在內(nèi)的所有變量以及 Shell 函數(shù)的列表。

          默認(rèn)狀態(tài)下,envprintenv 的功能是完全相同的:

          $ printenv SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22LESSCLOSE=/usr/bin/lesspipe %s %sLANG=C.UTF-8XDG_SESSION_ID=5USER=alvinMYVAR=lxlinux.netPWD=/home/alvinHOME=/home/alvinSSH_CLIENT=10.0.2.2 37182 22XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktopSSH_TTY=/dev/pts/0MAIL=/var/mail/alvinTERM=xterm-256colorSHELL=/bin/bashSHLVL=1LOGNAME=alvinXDG_RUNTIME_DIR=/run/user/1000PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binLESSOPEN=| /usr/bin/lesspipe %s_=/usr/bin/printenv

          只有在更具體的功能上才能體現(xiàn)出 env 命令與 printenv 命令的區(qū)別。例如,使用 printenv 命令,你可以請(qǐng)求單個(gè)變量的值:

          $ printenv SHELL/bin/bash$ printenv HOME/home/alvin$ printenv MYVARlxlinux.net

          env 命令可通過(guò)將一組變量傳遞給命令來(lái)修改程序運(yùn)行的環(huán)境:

          env MYVAR=lxlinux.net command_to_run command_options

          printenvenv 命令只能打印出環(huán)境變量,而如果你想打印出所有變量或者 Shell 函數(shù)的列表,你可以使用 set 指令。

          $ setBASH=/bin/bashBASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_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=140DIRSTACK=()EUID=1000GROUPS=()HISTCONTROL=ignorebothHISTFILE=/home/alvin/.bash_historyHISTFILESIZE=2000HISTSIZE=1000HOME=/home/alvinHOSTNAME=ubuntu-bionicHOSTTYPE=x86_64IFS=$' \t\n'LANG=C.UTF-8LESSCLOSE='/usr/bin/lesspipe %s %s'LESSOPEN='| /usr/bin/lesspipe %s'LINES=35LOGNAME=alvin.....

          該命令將顯示一個(gè)包含所有變量的大列表,因此你可能會(huì)希望將輸出傳遞給 less 命令。

          $ set | less



          設(shè)置 Shell 變量與環(huán)境變量


          Linux 系統(tǒng)中可以設(shè)置環(huán)境變量的命令有以下幾種:

          set — 該命令可以設(shè)置或者取消設(shè)置 Shell 變量。當(dāng)不帶參數(shù)使用 set 命令時(shí),它將打印出包括環(huán)境變量與 Shell 變量在內(nèi)的所有變量以及 Shell 函數(shù)的列表。

          unset — 該命令可以刪除 Shell 變量以及環(huán)境變量。

          export — 該命令可以設(shè)置環(huán)境變量。

          為了更好地理解 Shell 變量和環(huán)境變量之間的區(qū)別,我們先從設(shè)置 Shell 變量開(kāi)始講,然后再講環(huán)境變量。

          先從在當(dāng)前會(huì)話(huà)中定義一個(gè) Shell 變量開(kāi)始:

          $ MYVAR=lxlinux

          你可以用 echo $MYVAR 來(lái)驗(yàn)證變量是否已設(shè)置:

          $ echo $MYVARlxlinux

          使用 printenv 命令檢驗(yàn)該變量是否為環(huán)境變量:

          $ printenv MYVAR

          沒(méi)有輸出返回,這就意味著 MYVAR 變量并不是環(huán)境變量。

          export 命令可以用來(lái)設(shè)置環(huán)境變量。要?jiǎng)?chuàng)建環(huán)境變量,只需用 export 命令將 Shell 變量導(dǎo)出為環(huán)境變量:

          $ export MYVAR

          你可以用以下語(yǔ)句檢驗(yàn):

          $ printenv MYVARlxlinux

          當(dāng)然,你也可以只用一行代碼來(lái)設(shè)置環(huán)境變量:

          $ export MYNEWVAR="My New Variable"

          但是以這種方式創(chuàng)建的環(huán)境變量只能用于當(dāng)前會(huì)話(huà),如果你打開(kāi)一個(gè)新的 Shell 會(huì)話(huà),或者退出登陸,所有的變量都將會(huì)丟失。

          我們也可以將環(huán)境變量還原為 Shell 變量,或者將其完全刪除:

          MYVAR 變量被定義為環(huán)境變量,我們可以通過(guò)輸入以下代碼將其還原為 Shell 變量:

          $ export -n MYVAR

          這樣,MYVAR 變量就不再是環(huán)境變量了,但依然還是 Shell 變量。

          無(wú)論是 Shell 變量還是環(huán)境變量,想要完全刪除變量,都可以使用 unset 命令來(lái)刪除:

          $ unset MYVAR

          可以通過(guò)以下語(yǔ)句來(lái)驗(yàn)證 MYVAR 變量已經(jīng)刪除:

          $ echo $MYVAR

          由于變量已經(jīng)刪除了,所以沒(méi)有任何返回。



          環(huán)境變量的持久化


          許多程序都需要使用環(huán)境變量來(lái)決定具體的執(zhí)行方式,但是,我們并不希望每次啟動(dòng)新的 Shell 會(huì)話(huà)時(shí)都必須重新設(shè)置重要的變量,因此我們需要將重要的環(huán)境變量寫(xiě)入配置文件中。

          Shell 會(huì)話(huà)有不同的啟動(dòng)方式,比如,連接到終端的交互式 Shell 與未連接到終端的非交互式 Shell,還有登錄式 Shell 與非登錄式 Shell, 而 bash Shell 會(huì)根據(jù)會(huì)話(huà)不同的啟動(dòng)方式而讀取不同的配置文件。

          但是,在大多數(shù) Linux 發(fā)行版中,當(dāng)你啟動(dòng)一個(gè)新的 Shell 會(huì)話(huà)時(shí),一般都會(huì)從以下文件中讀取環(huán)境變量:

          /etc/environment — 使用此文件來(lái)設(shè)置系統(tǒng)范圍內(nèi)可用的環(huán)境變量。

          /etc/profile — 每當(dāng) bash 登錄 Shell 時(shí),都會(huì)加載此文件中設(shè)置的變量。

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

          如果要將新的環(huán)境變量加載到當(dāng)前的 Shell 會(huì)話(huà)中,可以使用source命令:

          $ source ~/.bashrc

          如果你想要設(shè)置環(huán)境變量,你就可以考慮將其添加到 /etc/profile/etc/bash.bashrc/etc/environment 文件中。



          結(jié)論


          在本文章中,我們了解了一些常見(jiàn)的環(huán)境變量和 Shell 變量,也學(xué)習(xí)了如何設(shè)置和查看這些變量,其實(shí)這些變量一直都在我們的 Shell 會(huì)話(huà)中,而且對(duì)許多程序都很有用,有很多常見(jiàn)的場(chǎng)景都會(huì)引用到這些變量。希望這對(duì)你的工作也有幫助。如果你還對(duì)這兩種變量有任何疑問(wèn),請(qǐng)留言告訴我唄!


          許個(gè)人微信


          添加良許個(gè)人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲取!

          推薦閱讀:

          機(jī)房布線(xiàn)的最高境界 | 最后的暗黑系,真是亮瞎眼

          一文講懂什么是vlan、三層交換機(jī)、網(wǎng)關(guān)、DNS、子網(wǎng)掩碼、MAC地址

          Linux后臺(tái)開(kāi)發(fā)必看!


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取!!


          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久操操操 | www.AV视频在线观看 | 99热热| 欧美群妇大交群实录 | 亚洲激情视频成人 |