Linux set、env、declare、export顯示shell變量的區別

Linux中 set、env、declare、export顯示shell變量的區別

shell變量包括兩種變量linux

1. shell局部變量

局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。
經過賦值語句定義好的變量,能夠經過以下方法定義shell變量shell

A1="1234"
delcare A2="2345"

2. 用戶的環境變量

全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。
經過export語法導出的shell私有變量,能夠經過以下方法導出用戶環境變量bash

A1="1234"
export A1  #先定義再導出
export A3="34"

顯示shell變量

env 這是一個工具,或者說一個Linux命令,顯示用戶的環境變量。
set 顯示用戶的局部變量和用戶環境變量。
export 顯示導出成用戶變量的shell局部變量,並顯示變量的屬性;就是顯示由局部變量導出成環境變量的那些變量 (好比能夠 export WWC導出一個環境變量,也可經過 declare -X LCY導出一個環境變量)
declare 跟set同樣,顯示用戶的shell變量 (局部變量和環境變量)服務器

declare 命令

declare命令用於聲明 shell 變量。
declare WWC="wangwenchao"
也能夠省略declare
WWC="wangwenchao"網絡

用法
declare [+/-][rxi][變量名稱=設置值] 或 declare -ftcp

  1. +/-  "-"可用來指定變量的屬性,"+"則是取消變量所設的屬性。
  2. -f  僅顯示函數。
  3. r  將變量設置爲只讀。
  4. x  指定的變量會成爲環境變量,可供shell之外的程序來使用。
  5. i  [設置值]能夠是數值,字符串或運算式。

export 命令

export命令用於設置或顯示環境變量。用於將局部變量導出成環境變量。ide

用法
export [-fnp][變量名稱]=[變量設置值]函數

  1. -f  表明[變量名稱]中爲函數名稱。
  2. -n  刪除指定的變量。變量實際上並未刪除,只是不會輸出到後續指令的執行環境中。
  3. -p  列出全部的shell賦予程序的環境變量。

**PS: export命令的功能跟 declare功能部分重合;export WWC="wangwenchao" 至關於 declare -x WWC="wangwenchao"; 功能export -n WWC 至關於 declare +x WWC; 功能export查看導出的環境變量工具

source 命令

source命令用法:
source FileName
做用:在當前bash環境下讀取並執行FileName中的命令。
注:該命令一般用命令「.」來替代。
如:source .bash_rc 與 . .bash_rc 是等效的。

source命令與shell scripts的區別是,source在當前bash環境下執行命令,而scripts是啓動一個子shell來執行命令。這樣若是把設置環境變量(或alias等等)的命令寫進scripts中,就只會影響子shell,沒法改變當前的BASH,因此經過文件(命令列)設置環境變量時,要用source 命令。

source跟./xxx.sh或bash xxx.sh最大的不一樣就是前者在文件中設置的變量對當前shell是可見的,然後者設置的變量對當前shell是不可見的。要知道./xxx.sh和bash xxx.sh都是在當前shell的子shell中執行的,子shell中的變量不會影響父shell,而source是把文件中的命令都讀出來一個個執行,全部的變量其實就是在父shell中設置的。

nohup 命令

nohup 命令是 no hanp up 的縮寫。
Unix/Linux下通常想讓某個程序在後臺運行,不少都是使用&在程序結尾來讓程序自動運行;但若是要想在退出終端後,程序依然還在後臺運行,則要用nohup與&組合來實現。

nohup用法
nohup Command [ Arg ... ] [&]

nohup 命令運行由 Command參數和任何相關的Arg參數指定的命令,同時忽略全部的掛起 (SIGHUP) 信號,或者修改用 -p 選項指定的進程來忽略全部的掛起 (SIGHUP) 信號(關閉終端、註銷用戶等,可是注意 ctrl + c 不是掛起信號)。
在註銷後還可使用 nohup 命令運行後臺中的程序。要運行後臺中的 nohup 命令,添加 &(表示「and」的符號)到命令的尾部。輸出將附加到當前目錄的nohup.out 文件中

注: -p pid 和 Command 不能一塊兒指定。
使用 -p pid 時,指定進程的輸出將不會重定向到 nohup.out。
ctrl + c nohup bash wwc.sh 會中止運行,可是 bash wwc.sh & 會正常運行;直接關閉終端 nohup bash wwc.sh 會正常運行,bash wwc.sh & 會中止;因此要 nohup 跟 & 結合使用。

殺死由nohup執行的進程

ps -ef | grep commond | grep -v grep  
例如:
ps -ef | grep "bash wwc.sh" | grep -v grep

找到進程id
kill -9 id

參考連接:https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.cmds4/nohup.htm

type 命令

type命令用來顯示指定命令的類型,判斷給出的指令是內部指令仍是外部指令。

用法

  1. -t:輸出「file」、「alias」或者「builtin」,分別表示給定的指令爲「外部指令」、「命令別名」或者「內部指令」;
  2. -p:若是給出的指令爲外部指令,則顯示其絕對路徑;
  3. -a:在環境變量「PATH」指定的路徑中,顯示給定指令的信息,包括命令別名。

結果
alias:別名。
keyword:關鍵字,Shell保留字。
function:函數,Shell函數。
builtin:內建命令,Shell內建命令。
file:文件,磁盤文件,外部命令。
unfound:沒有找到。

內建命令和外部命令

內建命令
內部命令其實是shell程序的一部分,其中包含的是一些比較簡單的linux系統命令,這些命令由shell程序識別並在shell程序內部完成運行,一般在linux系統加載運行時shell就被加載並駐留在系統內存中。內部命令是寫在bashy源碼裏面的,其執行速度比外部命令快,由於解析內部命令shell不須要建立子進程。好比:exit,history,cd,echo等。
有些命令是因爲其必要性才內建的,例如cd用來改變目錄,read會未來自用戶(和文件)的輸入數據傳給Shell外亮。
另外一種內建命令的存在則是爲了效率,其中最典型的就是test命令,編寫腳本時常常會用到它。另外還有I/O命令,例如echo於printf.

外部命令
外部命令是linux系統中的實用程序部分,由於實用程序的功能一般都比較強大,因此其包含的程序量也會很大,在系統加載時並不隨系統一塊兒被加載到內存中,而是在須要時纔將其調用內存。一般外部命令的實體並不包含在shell中,可是其命令執行過程是由shell程序控制的。shell程序管理外部命令執行的路徑查找、加載存放,並控制命令的執行。外部命令是在bash以外額外安裝的,一般放在/bin,/usr/bin,/sbin,/usr/sbin......等等。可經過「echo $PATH」命令查看外部命令的存儲路徑,好比:ls、vi等。

外部命令就是由Shell副本(新的進程)所執行的命令,基本的過程以下:

  1. 創建一個新的進程。此進程即爲Shell的一個副本。
  2. 在新的進程裏,在PATH變量內所列出的目錄中,尋找特定的命令。
    /bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin爲PATH變量典型的默認值。
    當命令名稱包含有斜槓(/)符號時,將略過路徑查找步驟。
  3. 在新的進程裏,以所找到的新程序取代執行中的Shell程序並執行。
  4. 程序完成後,最初的Shell會接着從終端讀取下一條命令,和執行腳本里的下一條命令。

用戶在命令行輸入命令後,通常狀況下Shell會fork並exec該命令,可是Shell的內建命令例外,執行內建命令至關於調用Shell進程中的一個函數,並不建立新的進程.
PS:爲了實現強大的功能,有些內建命令也有了外部命令實現的版本,這些外部命令每每比對應的內部命令功能更強大,可是相對效率可能會低(例如:cd、echo等);一樣一些外部命令爲了執行效力的問題,在內建命令中也有了實現(例如:printf);若是一個命令既有內部實現又有外部實現,直接使用使用的是其內部版本,要想使用其外部實現,可使用絕對路徑,好比:echo是使用的其內部命令,/bin/echo是使用的其外部命令,查看一個外部命令的路徑,可使用 which 命令,例如which echo

設置環境變量永久有效和臨時有效

永久有效

對全部用戶有效

/etc/profile 是每一個用戶登陸時都會運行的環境變量設置文件,當用戶第一次登陸時,該文件被執行。對全部用戶有效。
一個例子:

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

export THEOS=/opt/theos
export WWC=wangwenchao_lcy
對當前用戶有效

你能夠把你要添加的環境變量添加到你主目錄下面的.profile或者.bash_profile,若是該文件存在添加進去便可,若是該文件不存在,就在用戶主目錄下建立一個。

總結:

  1. /etc/profile (建議不修改這個文件 )
    全局(公有)配置,不論是哪一個用戶,登陸時都會讀取該文件。

  2. /etc/bashrc (通常在這個文件中添加系統級環境變量)
    全局(公有)配置,bash shell執行時,不論是何種方式,都會讀取此文件。能夠設置系統提示符 PS1等。好比 PS1=\h:\W \u$,那麼提示符的格式就是:主機:當前目錄 用戶名$

  3. ~/.bash_profile 或者 ~/.profile (通常在這個文件中添加用戶級環境變量)
    每一個用戶均可使用該文件輸入專用於本身使用的shell信息,當用戶登陸時,該文件僅僅執行一次!

PS: MAC下環境變量的加載順序/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile,而且這幾個文件~/.bash_profile ~/.bash_login ~/.profile是互斥的關係,若是前面的文件存在,後面的文件就不會加載

其餘配置文件

/etc/paths (全局建議修改這個文件)

編輯 paths,設置PATH環境變量

/etc/hosts

主機名和IP配置文件
hosts文件是Linux系統中一個負責IP地址與域名快速解析的文件,以ASCII格式保存在「/etc」目錄下,文件名爲「hosts」(不一樣的linux版本,這個配置文件也可能不一樣。好比Debian的對應文件是/etc/hostname)。hosts文件包含了IP地址和主機名之間的映射,還包括主機名的別名。在沒有域名服務器的狀況下,系統上的全部網絡程序都經過查詢該文件來解析對應於某個主機名的IP地址,不然就須要使用DNS服務程序來解決。一般能夠將經常使用的域名和IP地址映射加入到hosts文件中,實現快速方便的訪問。

hosts文件的格式以下:
IP地址 主機名/域名 主機別名(optional)

第一部份:網絡IP地址;
第二部份:主機名或域名;
第三部份:主機名別名;

系統目錄

usr目錄

usr 是 unix system resources 的縮寫

曾經的 /usr 仍是用戶的家目錄,存放着各類用戶文件 —— 如今已經被 /home 取代了(例如 /usr/someone 已經改成 /home/someone)。現代的 /usr 只專門存放各類程序和數據,用戶目錄已經轉移。雖然 /usr 名稱未改,不過其含義已經從「用戶目錄」變成了「unix 系統資源」目錄。值得注意的是,在一些 unix 系統上,仍然把 /usr/someone 當作用戶家目錄,如 Minix。

/sbin、/bin、/usr/sbin、/usr/bin的區別

/sbin 主要放置一些系統管理的必備程式,如 reboot、shutdown等;/sbin 下的命令屬於基本的系統命令

/bin 存放一些普通的基本命令,如ls,chmod等,這些命令在Linux系統裏的配置文件腳本里常常用到

/usr/sbin 放置一些用戶安裝的系統管理程式,存放的一些非必須的系統命令

/usr/bin 存放一些用戶命令

綜述:若是這是用戶和管理員必備的二進制文件,就會放在/bin。若是這是系統管理員必備,可是通常用戶根本不會用到的二進制文件,就會放在 /sbin。相對而言。若是不是用戶必備的二進制文件,多半會放在/usr/bin;若是不是系統管理員必備的工具,多半會放在/usr/sbin。

從歷史看Unix目錄結構

話說1969年,Ken Thompson和Dennis Ritchie在小型機PDP-7上發明了Unix。1971年,他們將主機升級到了PDP-11。
沒過多久,操做系統(根目錄)變得愈來愈大,一塊盤已經裝不下了。因而,他們加上了第二盤RK05,而且規定第一塊盤專門放系統程序,第二塊盤專門放用戶本身的程序,所以掛載的目錄點取名爲/usr。也就是說,根目錄"/"掛載在第一塊盤,"/usr"目錄掛載在第二塊盤。除此以外,兩塊盤的目錄結構徹底相同,第一塊盤的目錄(/bin, /sbin, /lib, /tmp...)都在/usr目錄下從新出現一次。
後來,第二塊盤也滿了,他們只好又加了第三盤RK05,掛載的目錄點取名爲/home,而且規定/usr用於存放用戶的程序,/home用於存放用戶的數據。
今後,這種目錄結構就延續了下來。隨着硬盤容量愈來愈大,各個目錄的含義進一步獲得明確。

  1. /:存放系統程序,也就是At&t開發的Unix程序。
  2. /usr:存放Unix系統商(好比IBM和HP)開發的程序。
  3. /usr/local:存放用戶本身安裝的程序。
  4. /opt:在某些系統,用於存放第三方廠商開發的程序,因此取名爲option,意爲"選裝"。

/usr/bin用於分發包管理器(如Ubuntu apt等)存放它所管理的應用的路徑, /usr/sbin與/usr/bin的關係相似與/bin和/sbin的關係
/usr/local/bin用於存放用戶本身的程序(如本身編譯出來的包等),不受分發包管理器的控制。若是用戶把本身的程序放在/usr/bin下,則有可能在將來被包管理器給修改、刪除或覆蓋了同名文件。

一般/usr/bin下面的都是系統預裝的可執行程序,會隨着系統升級而改變
/usr/local/bin目錄是給用戶放置本身的可執行程序的地方,推薦放在這裏,不會被系統升級而覆蓋同名文件

通常環境變量PATH都設置爲 /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin,注意設置的順序問題,若是在前面的目錄找到了命令,就不會再搜索後邊的目錄。

參考連接:Unix目錄結構的來歷——阮一峯的網絡日誌

問題

Linux環境變量的加載順序?

相關文章
相關標籤/搜索