一面哼、實(shí)驗(yàn)介紹
1.1 實(shí)驗(yàn)內(nèi)容
本節(jié)實(shí)驗(yàn)介紹環(huán)境變量的作用與用法野宜,及幾種搜索文件的方法。學(xué)會(huì)這些技巧可以高效地使用 Linux 魔策。
一匈子、環(huán)境變量
- 變量
要解釋環(huán)境變量,得先明白變量是什么闯袒,準(zhǔn)確的說(shuō)應(yīng)該是 Shell 變量旬牲,所謂變量就是計(jì)算機(jī)中用于記錄一個(gè)值(不一定是數(shù)值,也可以是字符或字符串)的符號(hào)搁吓,而這些符號(hào)將用于不同的運(yùn)算處理中。通常變量與值是一對(duì)一的關(guān)系吭历,可以通過(guò)表達(dá)式讀取它的值并賦值給其它變量堕仔,也可以直接指定數(shù)值賦值給任意變量。為了便于運(yùn)算和處理晌区,大部分的編程語(yǔ)言會(huì)區(qū)分變量的類型摩骨,用于分別記錄數(shù)值、字符或者字符串等等數(shù)據(jù)類型朗若。Shell 中的變量也基本如此恼五,有不同類型(但不用專門(mén)指定類型名),可以參與運(yùn)算哭懈,有作用域限定灾馒。
變量的作用域即變量的有效范圍(比如一個(gè)函數(shù)中、一個(gè)源文件中或者全局范圍)遣总,在該范圍內(nèi)只能有一個(gè)同名變量睬罗。一旦離開(kāi)則該變量無(wú)效,如同不存在這個(gè)變量一般旭斥。
在 Shell 中如何創(chuàng)建一個(gè)變量容达,如何給變量賦值和如何讀取變量的值呢?這里簡(jiǎn)單舉例說(shuō)明一下:
使用 declare命令創(chuàng)建一個(gè)變量名為 tmp 的變量:
$ declare tmp
其實(shí)也可以不用 declare 預(yù)聲明一個(gè)變量垂券,直接即用即創(chuàng)建花盐,這里只是告訴你 declare 的作用,這在創(chuàng)建其它指定類型的變量(如數(shù)組)時(shí)會(huì)用到。
使用 =號(hào)賦值運(yùn)算符算芯,將變量 tmp 賦值為 shiyanlou:
$ tmp=shiyanlou
讀取變量的值柒昏,使用 echo命令和 符號(hào)用于表示引用一個(gè)變量的值,初學(xué)者經(jīng)常忘記輸入**):
echo $tmp
注意:并不是任何形式的變量名都是可用的也祠,變量名只能是英文字母昙楚、數(shù)字或者下劃線,且不能以數(shù)字作為開(kāi)頭诈嘿。
- 環(huán)境變量
簡(jiǎ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)建過(guò)程中明確指定的話作郭,它將繼承其父進(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ū)別在于涉及的變量范圍不同。詳見(jiàn)下表:
命 令 | 說(shuō) 明 |
---|---|
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)境變量的變量,也能通過(guò)它將自定義變量導(dǎo)出為環(huán)境變量置侍。 |
你可以更直觀的使用 vimdiff工具比較一下它們之間的差別:
$ temp=shiyanlou
$ export temp_env=shiyanlou
$ env|sort>env.txt$ export|sort>export.txt
$ set|sort>set.txt
上述操作將命令輸出通過(guò)管道 |使用 sort命令排序映之,再重定向到對(duì)象文本文件中拦焚。
$ vimdiff env.txt export.txt set.txt
使用 vimdiff
工具比較導(dǎo)出的幾個(gè)文件的內(nèi)容:
關(guān)于哪些變量是環(huán)境變量,可以簡(jiǎn)單地理解成在當(dāng)前進(jìn)程的子進(jìn)程有效則為環(huán)境變量杠输,否則不是(有些人也將所有變量統(tǒng)稱為環(huán)境變量赎败,只是以全局環(huán)境變量和局部環(huán)境變量進(jìn)行區(qū)分,我們只要理解它們的實(shí)質(zhì)區(qū)別即可)蠢甲。我們這里用 export
命令來(lái)體會(huì)一下僵刮,先在 Shell 中設(shè)置一個(gè)變量 temp=shiyanlou,然后再新創(chuàng)建一個(gè)子 Shell 查看 temp變量的值:
注意:為了與普通變量區(qū)分鹦牛,通常我們習(xí)慣將環(huán)境變量名設(shè)為大寫(xiě)搞糕。
永久生效
但是問(wèn)題來(lái)了,當(dāng)你關(guān)機(jī)后曼追,或者關(guān)閉當(dāng)前的 shell 之后窍仰,環(huán)境變量就沒(méi)了啊。怎么才能讓環(huán)境變量永久生效呢礼殊?
按變量的生存周期來(lái)劃分驹吮,Linux 變量可分為兩類:
永久的:需要修改配置文件,變量永久生效晶伦;
臨時(shí)的:使用 export 命令行聲明即可碟狞,變量在關(guān)閉 shell 時(shí)失效。
這里介紹兩個(gè)重要文件 /etc/bashrc
(有的 Linux 沒(méi)有這個(gè)文件) 和 /etc/profile
婚陪,它們分別存放的是 shell 變量和環(huán)境變量篷就。還有要注意區(qū)別的是每個(gè)用戶目錄下的一個(gè)隱藏文件:
.profile 可以用 ls -a 查看cd /home/shiyanlouls -a
這個(gè) .profile 只對(duì)當(dāng)前用戶永久生效。而寫(xiě)在 /etc/profile
里面的是對(duì)所有用戶永久生效近忙,所以如果想要添加一個(gè)永久生效的環(huán)境變量,只需要打開(kāi) /etc/profile
智润,在最后加上你想添加的環(huán)境變量就好啦。
- 命令的查找路徑與順序
你可能很早之前就有疑問(wèn),我們?cè)?Shell 中輸入一個(gè)命令燃辖,Shell 是怎么知道去哪找到這個(gè)命令然后執(zhí)行的呢接奈?這是通過(guò)環(huán)境變量 PATH
來(lái)進(jìn)行搜索的,熟悉 Windows 的用戶可能知道 Windows 中的也是有這么一個(gè) PATH 環(huán)境變量兼蜈。這個(gè) PATH里面就保存了 Shell 中執(zhí)行的命令的搜索路徑查看 PATH環(huán)境變量的內(nèi)容:
$ echo $PATH
默認(rèn)情況下你會(huì)看到如下輸出:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
如果你還記得 Linux 目錄結(jié)構(gòu)那一節(jié)的內(nèi)容攘残,你就應(yīng)該知道上面這些目錄下放的是哪一類文件了。通常這一類目錄下放的都是可執(zhí)行文件为狸,當(dāng)我們?cè)?Shell 中執(zhí)行一個(gè)命令時(shí)歼郭,系統(tǒng)就會(huì)按照 PATH 中設(shè)定的路徑按照順序依次到目錄中去查找,如果存在同名的命令辐棒,則執(zhí)行先找到的那個(gè)病曾。
下面我們將練習(xí)創(chuàng)建一個(gè)最簡(jiǎn)單的可執(zhí)行 Shell 腳本和一個(gè)使用 C 語(yǔ)言創(chuàng)建的“ hello world ”程序.
創(chuàng)建一個(gè) Shell 腳本文件:
$ gedit hello_shell.sh
在腳本中添加如下內(nèi)容牍蜂,保存并退出(注意不要省掉第一行,這不是注釋泰涂,論壇有用戶反映有語(yǔ)法錯(cuò)誤鲫竞,就是因?yàn)闆](méi)有了第一行):
!/bin/bashfor ((i=0; i<10; i++));do echo "hello shell"doneexit 0
為文件添加可執(zhí)行權(quán)限:
$ chmod 755 hello_shell.sh
執(zhí)行腳本:
$ ./hello_shell.sh
創(chuàng)建一個(gè) C 語(yǔ)言“ hello world ”程序:
$ gedit hello_world.c
include <stdio.h>int main(void){ printf("hello world!\n"); return 0;}
保存后使用 gcc 生成可執(zhí)行文件:
$ gcc -o hello_world hello_world.c
gcc 生成二進(jìn)制文件默認(rèn)具有可執(zhí)行權(quán)限,不需要修改
在 shiyanlou 家目錄創(chuàng)建一個(gè) mybin
目錄逼蒙,并將上述 hello_shell.sh 和 hello_world 文件移動(dòng)到其中:
mv hello_shell.sh hello_world mybin/
現(xiàn)在你可以在 mybin
目錄中分別運(yùn)行你剛剛創(chuàng)建的兩個(gè)程序:
./hello_shell.sh$ ./hello_world
回到上一級(jí)目錄从绘,也就是 shiyanlou
家目錄,當(dāng)再想運(yùn)行那兩個(gè)程序時(shí)是牢,會(huì)發(fā)現(xiàn)提示命令找不到僵井,除非加上命令的完整路徑,但那樣很不方便妖泄,如何做到想使用系統(tǒng)命令一樣執(zhí)行自己創(chuàng)建的腳本文件或者程序呢驹沿?那就要將命令所在路徑添加到 PATH
環(huán)境變量了。
- 添加自定義路徑到“ PATH ”環(huán)境變量
在前面我們應(yīng)該注意到 PATH
里面的路徑是以 :
作為分割符的蹈胡,所以我們可以這樣添加自定義路徑:
PATH:/home/shiyanlou/mybin
注意這里一定要使用絕對(duì)路徑渊季。
現(xiàn)在你就可以在任意目錄執(zhí)行那兩個(gè)命令了(注意需要去掉前面的 ./
)。你可能會(huì)意識(shí)到這樣還并沒(méi)有很好的解決問(wèn)題罚渐,因?yàn)槲医o PATH 環(huán)境變量追加了一個(gè)路徑却汉,它也只是在當(dāng)前 Shell 有效,我一旦退出終端荷并,再打開(kāi)就會(huì)發(fā)現(xiàn)又失效了合砂。有沒(méi)有方法讓添加的環(huán)境變量全局有效?或者每次啟動(dòng) Shell 時(shí)自動(dòng)執(zhí)行上面添加自定義路徑到 PATH 的命令源织?下面我們就來(lái)說(shuō)說(shuō)后一種方式——讓它自動(dòng)執(zhí)行翩伪。
在每個(gè)用戶的 home 目錄中有一個(gè) Shell 每次啟動(dòng)時(shí)會(huì)默認(rèn)執(zhí)行一個(gè)配置腳本,以初始化環(huán)境谈息,包括添加一些用戶自定義環(huán)境變量等等缘屹。zsh 的配置文件是 .zshrc
,相應(yīng) Bash 的配置文件為 .bashrc
侠仇。它們?cè)?etc
下還都有一個(gè)或多個(gè)全局的配置文件轻姿,不過(guò)我們一般只修改用戶目錄下的配置文件。
我們可以簡(jiǎn)單地使用下面命令直接添加內(nèi)容到 .zshrc
中:
PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中 >>
表示將標(biāo)準(zhǔn)輸出以追加的方式重定向到一個(gè)文件中逻炊,注意前面用到的 >
是以覆蓋的方式重定向到一個(gè)文件中互亮,使用的時(shí)候一定要注意分辨。在指定文件不存在的情況下都會(huì)創(chuàng)建新的文件余素。
- 修改和刪除已有變量
變量修改
變量的修改有以下幾種方式:
變量設(shè)置方式
說(shuō)明
${變量名#匹配字串}
從頭向后開(kāi)始匹配豹休,刪除符合匹配字串的最短數(shù)據(jù)
${變量名##匹配字串}
從頭向后開(kāi)始匹配,刪除符合匹配字串的最長(zhǎng)數(shù)據(jù)
${變量名%匹配字串}
從尾向前開(kāi)始匹配桨吊,刪除符合匹配字串的最短數(shù)據(jù)
${變量名%%匹配字串}
從尾向前開(kāi)始匹配慕爬,刪除符合匹配字串的最長(zhǎng)數(shù)據(jù)
${變量名/舊的字串/新的字串}
將符合舊字串的第一個(gè)字串替換為新的字串
${變量名//舊的字串/新的字串}
將符合舊字串的全部字串替換為新的字串
比如要修改我們前面添加到 PATH 的環(huán)境變量窑眯。為了避免操作失誤導(dǎo)致命令找不到,我們先將 PATH 賦值給一個(gè)新的自定義變量 path:
PATH
path
{path%/home/shiyanlou/mybin}# 或使用通配符,表示任意多個(gè)任意字符
{path%/mybin}
變量刪除
可以使用 unset
命令刪除一個(gè)環(huán)境變量:
$ unset temp
- 如何讓環(huán)境變量立即生效
前面我們?cè)?Shell 中修改了一個(gè)配置腳本文件之后(比如 zsh 的配置文件 home 目錄下的 .zshrc
)医窿,每次都要退出終端重新打開(kāi)甚至重啟主機(jī)之后其才能生效磅甩,很是麻煩,我們可以使用 source
命令來(lái)讓其立即生效姥卢,如:
$ source .zshrc
source
命令還有一個(gè)別名就是 .
卷要,注意與表示當(dāng)前路徑的那個(gè)點(diǎn)區(qū)分開(kāi),雖然形式不一樣独榴,但作用和使用方式一樣僧叉,上面的命令如果替換成 .
的方式就該是:
$ . ./.zshrc
注意第一個(gè)點(diǎn)后面有一個(gè)空格,而且后面的文件必須指定完整的絕對(duì)或相對(duì)路徑名棺榔,source 則不需要瓶堕。
二、搜索文件
與搜索相關(guān)的命令常用的有 whereis症歇,which郎笆,find 和 locate 。
whereis 簡(jiǎn)單快速
$whereis who
你會(huì)看到它找到了三個(gè)路徑忘晤,兩個(gè)可執(zhí)行文件路徑和一個(gè) man 在線幫助文件所在路徑宛蚓,這個(gè)搜索很快,因?yàn)樗](méi)有從硬盤(pán)中依次查找设塔,而是直接從數(shù)據(jù)庫(kù)中查詢凄吏。whereis 只能搜索二進(jìn)制文件(-b),man 幫助文件(-m)和源代碼文件(-s)闰蛔。如果想要獲得更全面的搜索結(jié)果可以使用 locate 命令痕钢。
locate 快而全
通過(guò)“ /var/lib/mlocate/mlocate.db ”數(shù)據(jù)庫(kù)查找,不過(guò)這個(gè)數(shù)據(jù)庫(kù)也不是實(shí)時(shí)更新的序六,系統(tǒng)會(huì)使用定時(shí)任務(wù)每天自動(dòng)執(zhí)行 updatedb 命令更新一次任连,所以有時(shí)候你剛添加的文件,它可能會(huì)找不到难咕,需要手動(dòng)執(zhí)行一次 updatedb 命令(在我們的環(huán)境中必須先執(zhí)行一次該命令)。它可以用來(lái)查找指定目錄下的不同文件類型距辆,如查找 /etc 下所有以 sh 開(kāi)頭的文件:
$ locate /etc/sh
注意余佃,它不只是在 /etc 目錄下查找,還會(huì)自動(dòng)遞歸子目錄進(jìn)行查找跨算。
查找 /usr/share/ 下所有 jpg 文件:
$ locate /usr/share/*.jpg
注意要添加 *
號(hào)前面的反斜杠轉(zhuǎn)義爆土,否則會(huì)無(wú)法找到。
如果想只統(tǒng)計(jì)數(shù)目可以加上 -c 參數(shù)诸蚕,-i 參數(shù)可以忽略大小寫(xiě)進(jìn)行查找步势,whereis 的 -b氧猬、-m、-s同樣可以使用坏瘩。
which 小而精
which 本身是 Shell 內(nèi)建的一個(gè)命令盅抚,我們通常使用 which 來(lái)確定是否安裝了某個(gè)指定的軟件,因?yàn)樗粡?PATH 環(huán)境變量指定的路徑中去搜索命令:
$ which man
find 精而細(xì)
find 應(yīng)該是這幾個(gè)命令中最強(qiáng)大的了倔矾,它不但可以通過(guò)文件類型妄均、文件名進(jìn)行查找而且可以根據(jù)文件的屬性(如文件的時(shí)間戳,文件的權(quán)限等)進(jìn)行搜索哪自。find 命令強(qiáng)大到丰包,要把它講明白至少需要單獨(dú)好幾節(jié)課程才行,我們這里只介紹一些常用的內(nèi)容壤巷。
這條命令表示去 /etc/ 目錄下面 邑彪,搜索名字叫做 interfaces 的文件或者目錄。這是 find 命令最常見(jiàn)的格式胧华,千萬(wàn)記住 find 的第一個(gè)參數(shù)是要搜索的地方:
$ sudo find /etc/ -name interfaces
注意 find 命令的路徑是作為第一個(gè)參數(shù)的寄症, 基本命令格式為 find [path] [option] [action] 。
與時(shí)間相關(guān)的命令參數(shù):
參數(shù) | 說(shuō)明 |
---|---|
-atime | 最后訪問(wèn)時(shí)間 |
-ctime | 最后修改文件內(nèi)容的時(shí)間 |
-mtime | 最后修改文件屬性的時(shí)間 |
下面以 -mtime
參數(shù)舉例:
-mtime n:n 為數(shù)字撑柔,表示為在 n 天之前的“一天之內(nèi)”修改過(guò)的文件
-mtime +n:列出在 n 天之前(不包含 n 天本身)被修改過(guò)的文件
-mtime -n:列出在 n 天之內(nèi)(包含 n 天本身)被修改過(guò)的文件
-newer file:file 為一個(gè)已存在的文件瘸爽,列出比 file 還要新的文件名
列出 home 目錄中,當(dāng)天(24 小時(shí)之內(nèi))有改動(dòng)的文件:
$ find ~ -mtime 0
列出用戶家目錄下比 Code 文件夾新的文件:
$ find ~ -newer /home/shiyanlou/Code
三铅忿、更多
輕松一下
《黑客帝國(guó)》電影里滿屏幕代碼的“數(shù)字雨”剪决,在 Linux 里面你也可以輕松實(shí)現(xiàn)這樣的效果,你只需要一個(gè)命令 cmatrix 檀训。
需要安裝柑潦,因?yàn)?Ubuntu 沒(méi)有預(yù)裝:
$ sudo apt-get update;sudo;apt-get install cmatrix
裝好之后先不要急著執(zhí)行峻凫,為了看到更好的效果渗鬼,我們需要先修改終端的主題配色,修改為黑底綠字荧琼。