每天一點命令行2-Unix環(huán)境變量

首先推薦一個命令說明中文網(wǎng)站linuxde

今天介紹

  1. 命令及環(huán)境設(shè)置有關(guān)的Unix命令:type, which。
  2. 環(huán)境變量,腳本以及shebang基本概念。
  3. 針對易混淆的Unix shell內(nèi)置命令export, set與Unix命令env進行闡述。
  4. source, sh的用法的區(qū)別,使用場景介紹。

Shell命令

1.type

type命令返回指定命令的類型的描述,判斷給出的命令是外部命令還是內(nèi)部命令。
使用直接type 命令,將返回命令的類型描述,所在的位置
命令類型有以下幾種

  • alias:別名。
  • keyword:關(guān)鍵字,Shell保留字。
  • function:函數(shù),Shell函數(shù)。
  • builtin:內(nèi)建命令,Shell內(nèi)建命令。
  • file:文件,磁盤文件,外部命令。
  • unfound:沒有找到


    type

2. which

which命令返回所查詢命令的絕對地址到屏幕上。
輸入which命令會到所設(shè)置的環(huán)境變量目錄里去尋找命令所在位置并默認返回第一個匹配值。


which

環(huán)境變量:

環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運行環(huán)境的一些參數(shù),如:臨時文件夾位置和系統(tǒng)文件夾位置等。

環(huán)境變量是在操作系統(tǒng)中一個具有特定名字的對象,它包含了一個或者多個應(yīng)用程序所將使用到的信息。例如Windows和DOS操作系統(tǒng)中的path環(huán)境變量,當要求系統(tǒng)運行一個程序而沒有告訴它程序所在的完整路徑時,系統(tǒng)除了在當前目錄下面尋找此程序外,還應(yīng)到path中指定的路徑去找。用戶通過設(shè)置環(huán)境變量,來更好的運行進程。

--參考百度百科

--以下是WIKI的總結(jié).
環(huán)境變量最開始是由于fork,exec的需要,即調(diào)用其他程序時,Unix系統(tǒng)會先fork即復(fù)制caller程序本身,子程序會繼承caller的非生成的環(huán)境變量并做相應(yīng)的設(shè)置,然后exec即子程序被要調(diào)用的程序覆蓋,這樣做可以使調(diào)用程序正確獲得合適的路徑或防止調(diào)用程序造成惡意攻擊。

維基上的解釋為環(huán)境變量為動態(tài)命名的變量,它們會影響執(zhí)行的進行的動作,比如到哪里去尋找合適文件夾位置去訪問或存放數(shù)據(jù),比如TEMP是存放臨時數(shù)據(jù),USERPROFILE可以獲取被用戶所有的目錄結(jié)構(gòu)等。

環(huán)境變量的特點:

  1. 通過SET或VARIABLENAME=value, export VARIABLENAME等方式設(shè)置的環(huán)境變量僅僅在本地當前的進程有效(即在被設(shè)置的當前終端有效), 新建終端將無法使用
  2. 當子進程被建立時,它將會繼承父進程的環(huán)境變量
  3. 環(huán)境變量是區(qū)分大小寫的
    例子:創(chuàng)建一個環(huán)境變量,并顯示它
    env

    可以通過echo $PATHecho $HOME看PATH或HOME里有哪些環(huán)境變量

腳本:

介紹Unix類系統(tǒng)腳本概念,即shell script. DOS及Windows參考Batch file, 或CMD.exe。
script英語為劇本意思,shell script是指一種計算機程序,設(shè)計為被Unix shell執(zhí)行的一種命令行解釋器, 注意是解釋器,類似劇本,一幕一幕地去演繹,Python同樣也是由解釋器進行動態(tài)解釋,故Python也被稱為腳本語言。與之相反的是需要編譯后執(zhí)行的,如C等,類似電影,需要編譯錄制后在播放。
寫好script,要通過shell script進行執(zhí)行,如sh demo將通過sh解釋執(zhí)行demo腳本。

常見的shell script有sh(Bourne shell, 誕生于Unix,最早于Version 7 Unix上搭載,符合POSIX 標準), bash(Bourne Again Shell,Brian Fox為了GNU Project免費軟件的提倡所寫的), 此外還有ssh等。由于在絕大多數(shù)GNU/Linux系統(tǒng)上,sh一直以來都被用作指向bash,故通常用bash和sh都是一樣的效果。但其實這兩個是不同的,sh是一個specification, 而它有很多的implementation, bash僅僅是其中一個默認使用最多的implementation(bash由于開源等,有許多擴展,導(dǎo)致其后續(xù)不再是有效的POSIX shell,變成一種變種,但bash添加了--posix兼容選項)。

在Script里,我們其實可以指定使用哪個shell script,通過在首行插入Shebang行,例如#!/bin/sh 將使用sh或任何sh所指向implementation來解釋腳本,#!/bin/bash將使用bash來執(zhí)行。
具體sh/bash區(qū)別可以參考這里

SheBang

Shebang是位于腳本首行,以!#開頭的字符串,用于指定特定的解釋器來執(zhí)行腳本語言。

Shell命令set/export 與 env 的區(qū)別

set與export為shell(sh,bash)等內(nèi)置的命令。
env為Unix外部命令,不是shell自帶的,顯示環(huán)境變量僅僅是其一個功能。

在shell中直接輸入set,將顯示用戶環(huán)境變量, 未被導(dǎo)出到環(huán)境的變量(regular variable)以及函數(shù)功能定義

在shell中直接輸入export或env,將顯示以不同格式呈現(xiàn)的環(huán)境變量,輸出的都是同樣的環(huán)境變量,僅僅格式不一樣。

export

用來設(shè)置(添加&刪除)和顯示環(huán)境變量。
命令用法如下:
export [-fnp][變量名稱]=[變量設(shè)置值]
參數(shù)說明:
-f  代表[變量名稱]中為函數(shù)名稱。
-n  刪除指定的變量。變量實際上并未刪除,只是不會輸出到后續(xù)指令的執(zhí)行環(huán)境中。
-p  列出所有的shell賦予程序的環(huán)境變量。
設(shè)置實例如下:
export PATH="需要設(shè)置的路徑:$PATH
這句話是將要設(shè)置的路徑添加到環(huán)境變量里,且添加到PATH目錄的開頭。添加到環(huán)境變量后,在終端輸入的腳本名稱或命令名稱就可被直接執(zhí)行。系統(tǒng)將從所有的環(huán)境變量中進行尋找該名稱。
以上若要添加到PATH路徑末尾,可以改為$PATH:需要設(shè)置的路徑。
下面是一個例子,將documents里的Linux文件夾添加到PATH目錄末尾,這樣就可以直接在shell終端輸入Linux文件夾里的腳本文件進行執(zhí)行。

export

可看到通過export PATH="$PATH:~/documents/Linux"命令后,將~/documents/Linux路徑添加到了PATH路徑的末尾,而通過export命令也可以看到在PATH里多了一個路徑。

若是在終端建立一個變量,不使用export命令,則該變量僅僅能通過set顯示,實例如下:

$ x1=123
$ x2=234; export x2
$ export x3=345

運行上述代碼后使用set可以顯示已經(jīng)被export的x2, x3和未被導(dǎo)出的x1,而env和export命令只能顯示x2,x3


set

注意以上set, export在sh和bash中顯示的輸出格式可能有所差別,在sh中set,export輸出顯示格式一致,而bash中export輸出以declar -x var=value顯示。

總結(jié):

  1. 不是所有的shell變量都是環(huán)境變量
  2. set命令將列出所有的變量和函數(shù)
  3. export命令將列出環(huán)境變量
  4. set 與 export 命令是集成到shell里的
  5. env命令(無參數(shù))將列出所執(zhí)行env命令的進程從其父進程中繼承的環(huán)境變量

source與.命令和shell script的區(qū)別

source命令在bash或其他類似的POSIX shell中可以縮寫成.命令,但在C shell中不行,source命令最早是在C shell中出現(xiàn)的。

下面介紹下什么情況下使用source命令再通過例子來對比其與shell script的不同之處。

  1. 腳本里有cd命令,而且用戶希望執(zhí)行完腳本后立刻進入那個目錄。
  2. 腳本里有export命令,而且用戶希望執(zhí)行完腳本后環(huán)境變量的修改立刻反饋到當前的shell里。
  3. 在腳本沒有執(zhí)行的權(quán)限,使用source命令可強制執(zhí)行該腳本。

shell script與source的區(qū)別:
使用shell script執(zhí)行腳本將創(chuàng)建一個subshell進行執(zhí)行,環(huán)境變量僅在subshell有效,關(guān)閉subshell后將失效,這就是為什么直接使用shell命令export在當前終端中設(shè)置變量后,重新打開一個終端設(shè)置無效了,這時需要將環(huán)境變量的設(shè)置寫入到./bashrc里,然后通過source ./bashrc執(zhí)行,執(zhí)行完后在當前終端(current context)生效,并且重新打開終端也會生效。

實例1:source會強制在當前終端是設(shè)置的環(huán)境變量生效,而sh則通過生成子shell,命令結(jié)束后變量無法export

source-1.png

實例2:source 與 sh 執(zhí)行含有cd命令的腳本不同


source-sh.png

以上則是針對環(huán)境變量概念及腳本概念的相關(guān)介紹,并針對容易混淆的命令進行了區(qū)分,簡要介紹了Unix環(huán)境變量的執(zhí)行過程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容