Linux中 set、env、declare、export顯示shell變量的區別
shell變量包括兩種變量
1. shell局部變量
局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量。
通過賦值語句定義好的變量,可以通過如下方法定義shell變量
A1="1234"
delcare A2="2345"
2. 用戶的環境變量
所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。
通過export語法導出的shell私有變量,可以通過如下方法導出用戶環境變量
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 -f
- +/- "-"可用來指定變量的屬性,"+"則是取消變量所設的屬性。
- -f 僅顯示函數。
- r 將變量設置為只讀。
- x 指定的變量會成為環境變量,可供shell以外的程序來使用。
- i [設置值]可以是數值,字符串或運算式。
export 命令
export命令用於設置或顯示環境變量。用於將局部變量導出成環境變量。
用法
export [-fnp][變量名稱]=[變量設置值]
- -f 代表[變量名稱]中為函數名稱。
- -n 刪除指定的變量。變量實際上並未刪除,只是不會輸出到后續指令的執行環境中。
- -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命令用來顯示指定命令的類型,判斷給出的指令是內部指令還是外部指令。
用法
- -t:輸出“file”、“alias”或者“builtin”,分別表示給定的指令為“外部指令”、“命令別名”或者“內部指令”;
- -p:如果給出的指令為外部指令,則顯示其絕對路徑;
- -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副本(新的進程)所執行的命令,基本的過程如下:
- 建立一個新的進程。此進程即為Shell的一個副本。
- 在新的進程里,在PATH變量內所列出的目錄中,尋找特定的命令。
/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin為PATH變量典型的默認值。
當命令名稱包含有斜杠(/)符號時,將略過路徑查找步驟。 - 在新的進程里,以所找到的新程序取代執行中的Shell程序並執行。
- 程序完成后,最初的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,如果該文件存在添加進去即可,如果該文件不存在,就在用戶主目錄下創建一個。
總結:
-
/etc/profile (建議不修改這個文件 )
全局(公有)配置,不管是哪個用戶,登錄時都會讀取該文件。 -
/etc/bashrc (一般在這個文件中添加系統級環境變量)
全局(公有)配置,bash shell執行時,不管是何種方式,都會讀取此文件。可以設置系統提示符 PS1等。比如 PS1=\h:\W \u$,那么提示符的格式就是:主機:當前目錄 用戶名$ -
~/.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用於存放用戶的數據。
從此,這種目錄結構就延續了下來。隨着硬盤容量越來越大,各個目錄的含義進一步得到明確。
- /:存放系統程序,也就是At&t開發的Unix程序。
- /usr:存放Unix系統商(比如IBM和HP)開發的程序。
- /usr/local:存放用戶自己安裝的程序。
- /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,注意設置的順序問題,如果在前面的目錄找到了命令,就不會再搜索后邊的目錄。
問題
Linux環境變量的加載順序?