Linux 學(xué)習(xí)之路(六):環(huán)境變量與文件查找
一、環(huán)境變量
-
變量
要解釋環(huán)境變量,得先明白變量是什么,準(zhǔn)確的說應(yīng)該是 Shell 變量,所謂變量就是計(jì)算機(jī)中用于記錄一個(gè)值(不一定是數(shù)值,也可以是字符或字符串)的符號(hào),而這些符號(hào)將用于不同的運(yùn)算處理中。通常變量與值是一對(duì)一的關(guān)系,可以通過表達(dá)式讀取它的值并賦值給其它變量,也可以直接指定數(shù)值賦值給任意變量。為了便于運(yùn)算和處理,大部分的編程語言會(huì)區(qū)分變量的類型,用于分別記錄數(shù)值、字符或者字符串等等數(shù)據(jù)類型。Shell 中的變量也基本如此,有不同類型(但不用專門指定類型名),可以參與運(yùn)算,有作用域限定。
變量的作用域即變量的有效范圍(比如一個(gè)函數(shù)中、一個(gè)源文件中或者全局范圍),在該范圍內(nèi)只能有一個(gè)同名變量。一旦離開則該變量無效,如同不存在這個(gè)變量一般。
- 使用
declare命令創(chuàng)建一個(gè)變量名為tmp的變量:
declare tmp- 使用 = 號(hào)賦值運(yùn)算符,將變量 tmp 賦值為 LowoL:
tmp=LowoL- 讀取變量的值,使用
echo命令和$符號(hào)($符號(hào)用于表示引用一個(gè)變量的值,初學(xué)者經(jīng)常忘記輸入):
echo tmp注意:并不是任何形式的變量名都是可用的,變量名只能是英文字母、數(shù)字或者下劃線,且不能以數(shù)字作為開頭。
- 使用
-
環(huán)境變量
簡單理解了變量的概念,就很容易理解環(huán)境變量了。環(huán)境變量的作用域比自定義變量的要大,如 Shell 的環(huán)境變量作用于自身和它的子進(jìn)程。在所有的 UNIX 和類 UNIX 系統(tǒng)中,每個(gè)進(jìn)程都有其各自的環(huán)境變量設(shè)置,且默認(rèn)情況下,當(dāng)一個(gè)進(jìn)程被創(chuàng)建時(shí),除了創(chuàng)建過程中明確指定的話,它將繼承其父進(jìn)程的絕大部分環(huán)境設(shè)置。Shell 程序也作為一個(gè)進(jìn)程運(yùn)行在操作系統(tǒng)之上,而我們?cè)?Shell 中運(yùn)行的大部分命令都將以 Shell 的子進(jìn)程的方式運(yùn)行。
通常我們會(huì)涉及到的變量類型有三種:
- 當(dāng)前 Shell 進(jìn)程私有用戶自定義變量,如上面我們創(chuàng)建的
tmp變量,只在當(dāng)前 Shell 中有效。 - Shell 本身內(nèi)建的變量。
- 從自定義變量導(dǎo)出的環(huán)境變量。
也有三個(gè)與上述三種環(huán)境變量相關(guān)的命令:set,env,export。這三個(gè)命令很相似,都是用于打印環(huán)境變量信息,區(qū)別在于涉及的變量范圍不同。詳見下表:
命 令 說 明 set顯示當(dāng)前 Shell 所有變量,包括其內(nèi)建環(huán)境變量(與 Shell 外觀等相關(guān)),用戶自定義變量及導(dǎo)出的環(huán)境變量。 env顯示與當(dāng)前用戶相關(guān)的環(huán)境變量,還可以讓命令在指定環(huán)境中運(yùn)行。 export顯示從 Shell 中導(dǎo)出成環(huán)境變量的變量,也能通過它將自定義變量導(dǎo)出為環(huán)境變量。 你可以更直觀的使用
vimdiff工具比較一下它們之間的差別:temp=LowoL export temp_env=LowoL env|sort>env.txt export|sort>export.txt set|sort>set.txt上述操作將命令輸出通過管道
|使用sort命令排序,再重定向到對(duì)象文本文件中。vimdiff env.txt export.txt set.txt - 當(dāng)前 Shell 進(jìn)程私有用戶自定義變量,如上面我們創(chuàng)建的
-
命令的搜索路徑
熟悉 Windows 的用戶可能知道 Windows 中的也是有這么一個(gè)
PATH環(huán)境變量。同樣 Linux 環(huán)境變量PATH里面就保存了 Shell 中執(zhí)行的命令的搜索路徑。查看
PATH環(huán)境變量的內(nèi)容:echo $PATH通常
PATH環(huán)境變量中目錄下放的都是可執(zhí)行文件,當(dāng)我們?cè)?Shell 中執(zhí)行一個(gè)命令時(shí),系統(tǒng)就會(huì)按照PATH中設(shè)定的路徑按照順序依次到目錄中去查找,如果存在同名的命令,則執(zhí)行先找到的那個(gè)。 -
添加自定義路徑到
PATH環(huán)境變量在前面我們應(yīng)該注意到
PATH里面的路徑是以:作為分割符的,所以我們可以這樣添加自定義路徑:PATH=$PATH:/home/shiyanlou/mybin注意這里一定要使用絕對(duì)路徑。
由于在每個(gè)用戶的
home目錄中有一個(gè) Shell 每次啟動(dòng)時(shí)會(huì)默認(rèn)執(zhí)行一個(gè)配置腳本,以初始化環(huán)境,包括添加一些用戶自定義環(huán)境變量等等。如要啟動(dòng) Shell 時(shí)自動(dòng)添加自定義路徑到PATH,我們需要對(duì)這些文件進(jìn)行修改。zsh的配置文件是.zshrc,相應(yīng)Bash的配置文件為.bashrc。它們?cè)?etc下還都有一個(gè)或多個(gè)全局的配置文件,不過我們一般只修改用戶目錄下的配置文件。我們可以簡單地使用下面命令直接添加內(nèi)容到
.zshrc中:echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc上述命令中 >> 表示將標(biāo)準(zhǔn)輸出以追加的方式重定向到一個(gè)文件中,注意前面用到的 > 是以覆蓋的方式重定向到一個(gè)文件中,使用的時(shí)候一定要注意分辨。在指定文件不存在的情況下都會(huì)創(chuàng)建新的文件。
-
變量修改
變量的修改有以下幾種方式:變量設(shè)置方式 說明 {變量名#匹配字串}從頭向后開始匹配,刪除符合匹配字串的最短數(shù)據(jù) {變量名##匹配字串}從頭向后開始匹配,刪除符合匹配字串的最長數(shù)據(jù) {變量名%匹配字串}從尾向前開始匹配,刪除符合匹配字串的最短數(shù)據(jù) {變量名%%匹配字串}從尾向前開始匹配,刪除符合匹配字串的最長數(shù)據(jù) {變量名/舊的字串/新的字串}將符合舊字串的第一個(gè)字串替換為新的字串 {變量名//舊的字串/新的字串}將符合舊字串的全部字串替換為新的字串 -
變量刪除
可以使用unset命令刪除一個(gè)環(huán)境變量:unset temp -
使
PATH環(huán)境變量立即生效前面我們?cè)?Shell 中修改了一個(gè)配置腳本文件之后(比如
zsh的配置文件home目錄下的.zshrc),每次都要退出終端重新打開甚至重啟主機(jī)之后其才能生效,很是麻煩,我們可以使用source命令來讓其立即生效,如:cd source .zshrcsource命令還有一個(gè)別名就是.,上面的命令如果替換成.的方式就該是:. ./.zshrc在使用
.的時(shí)候,需要注意與表示當(dāng)前路徑的那個(gè)點(diǎn)區(qū)分開。
注意第一個(gè)點(diǎn)后面有一個(gè)空格,而且后面的文件必須指定完整的絕對(duì)或相對(duì)路徑名,source則不需要。
二、文件查找
-
whereis簡單快速whereis who whereis find你會(huì)看到
whereis find找到了三個(gè)路徑,兩個(gè)可執(zhí)行文件路徑和一個(gè)man在線幫助文件所在路徑,這個(gè)搜索很快,因?yàn)樗]有從硬盤中依次查找,而是直接從數(shù)據(jù)庫中查詢。whereis只能搜索二進(jìn)制文件(-b),man幫助文件(-m)和源代碼文件(-s)。如果想要獲得更全面的搜索結(jié)果可以使用locate命令。 -
locate快而全通過“ /var/lib/mlocate/mlocate.db ”數(shù)據(jù)庫查找,不過這個(gè)數(shù)據(jù)庫也不是實(shí)時(shí)更新的,系統(tǒng)會(huì)使用定時(shí)任務(wù)每天自動(dòng)執(zhí)行
updatedb命令更新一次,所以有時(shí)候你剛添加的文件,它可能會(huì)找不到,需要手動(dòng)執(zhí)行一次updatedb命令(在我們的環(huán)境中必須先執(zhí)行一次該命令)。它可以用來查找指定目錄下的不同文件類型,如查找/etc下所有以sh開頭的文件:sudo updatedb locate /etc/sh注意,它不只是在
/bin目錄下查找,還會(huì)自動(dòng)遞歸子目錄進(jìn)行查找。查找
/usr/share/下所有jpg文件:locate /usr/share/\*.jpg注意要添加
*號(hào)前面的反斜杠轉(zhuǎn)義,否則會(huì)無法找到。如果想只統(tǒng)計(jì)數(shù)目可以加上
-c參數(shù),-i參數(shù)可以忽略大小寫進(jìn)行查找,whereis的-b、-m、-s同樣可以使用。 -
which小而精which本身是 Shell 內(nèi)建的一個(gè)命令,我們通常使用which來確定是否安裝了某個(gè)指定的軟件,因?yàn)樗粡?PATH環(huán)境變量指定的路徑中去搜索命令:which man -
find精而細(xì)
find應(yīng)該是這幾個(gè)命令中最強(qiáng)大的了,它不但可以通過文件類型、文件名進(jìn)行查找而且可以根據(jù)文件的屬性(如文件的時(shí)間戳,文件的權(quán)限等)進(jìn)行搜索。這條命令表示去
/etc/目錄下面 ,搜索名字叫做interfaces的文件或者目錄。這是find命令最常見的格式,千萬記住find的第一個(gè)參數(shù)是要搜索的地方:sudo find /etc/ -name interfaces注意
find命令的路徑是作為第一個(gè)參數(shù)的, 基本命令格式為find [path] [option] [action]。與時(shí)間相關(guān)的命令參數(shù):
參數(shù) 說明 -atime最后訪問時(shí)間 -ctime最后修改文件內(nèi)容的時(shí)間 -mtime最后修改文件屬性的時(shí)間 下面以
-mtime參數(shù)舉例:-
-mtime n:n 為數(shù)字,表示為在 n 天之前的“一天之內(nèi)”修改過的文件 -
-mtime +n:列出在 n 天之前(不包含 n 天本身)被修改過的文件 -
-mtime -n:列出在 n 天之內(nèi)(包含 n 天本身)被修改過的文件 -
-newer file:file 為一個(gè)已存在的文件,列出比 file 還要新的文件名
列出
home目錄中,當(dāng)天(24 小時(shí)之內(nèi))有改動(dòng)的文件:find ~ -mtime 0列出用戶家目錄下比 Code 文件夾新的文件:
find ~ -newer /home/LowoL/Code -
三、作業(yè)
-
找出
/etc/目錄下的所有以.list結(jié)尾的文件。- 利用
locate命令
sudo updatedb sudo locate /etc/\*.list- 利用
find命令
sudo find /etc/ -name *.list - 利用