介紹環境變量的作用與用法,及幾種搜尋檔案的方法。學會這些技巧可以高效地使用 Linux 。
更多教程:本人部落格
環境變量
變量
要解釋環境變量,得先明白變量是什麼,準确的說應該是 Shell 變量,所謂變量就是計算機中用于記錄一個值(不一定是數值,也可以是字元或字元串)的符号,而這些符号将用于不同的運算進行中。通常變量與值是一對一的關系,可以通過表達式讀取它的值并指派給其它變量,也可以直接指定數值指派給任意變量。為了便于運算和處理,大部分的程式設計語言會區分變量的類型,用于分别記錄數值、字元或者字元串等等資料類型。Shell 中的變量也基本如此,有不同類型(但不用專門指定類型名),可以參與運算,有作用域限定。
變量的作用域即變量的有效範圍(比如一個函數中、一個源檔案中或者全局範圍),在該範圍内隻能有一個同名變量。一旦離開則該變量無效,如同不存在這個變量一般。
shell建立變量
declare tmp
shell變量複制
temp=zxp
輸出變量
echo $temp
注意:并不是任何形式的變量名都是可用的,變量名隻能是英文字母、數字或者下劃線,且不能以數字作為開頭
環境變量
環境變量的作用域比自定義變量的要大,如 Shell 的環境變量作用于自身和它的子程序。在所有的 UNIX 和類 UNIX 系統中,每個程序都有其各自的環境變量設定,且預設情況下,當一個程序被建立時,除了建立過程中明确指定的話,它将繼承其父程序的絕大部分環境設定。Shell 程式也作為一個程序運作在作業系統之上,而我們在 Shell 中運作的大部分指令都将以 Shell 的子程序的方式運作。
通常我們會涉及到的變量類型有三種:
- 目前 Shell 程序私有使用者自定義變量,如上面我們建立的 tmp 變量,隻在目前 Shell 中有效。
- Shell 本身内建的變量。
-
從自定義變量導出的環境變量。
也有三個與上述三種環境變量相關的指令:set,env,export。這三個指令很相似,都是用于列印環境變量資訊,差別在于涉及的變量範圍不同。詳見下表:
命 令 | 說 明 |
---|---|
set | 顯示目前 Shell 所有變量,包括其内建環境變量(與 Shell 外觀等相關),使用者自定義變量及導出的環境變量。 |
env | 顯示與目前使用者相關的環境變量,還可以讓指令在指定環境中運作。 |
export | 顯示從 Shell 中導出成環境變量的變量,也能通過它将自定義變量導出為環境變量。 |
環境變量永久生效
按變量的生存周期來劃分,Linux 變量可分為兩類:
- 永久的:需要修改配置檔案,變量永久生效;
- 臨時的:使用 export 指令行聲明即可,變量在關閉 shell 時失效。
介紹兩個重要檔案 /etc/bashrc(有的 Linux 沒有這個檔案) 和 /etc/profile ,它們分别存放的是 shell 變量和環境變量。還有要注意差別的是每個使用者目錄下的一個隐藏檔案: .profile 隻對目前使用者永久生效。而寫在 /etc/profile 裡面的是對所有使用者永久生效,是以如果想要添加一個永久生效的環境變量,隻需要打開 /etc/profile,在最後加上你想添加的環境變量就好啦。
檢視每個使用者的永久生效的環境變量:
cd /home/使用者名
ls -a
指令查找路徑與順序
Shell 是怎麼知道去哪找到這個指令然後執行的呢?這是通過環境變量 PATH 來進行搜尋的,熟悉 Windows 的使用者可能知道 Windows 中的也是有這麼一個 PATH 環境變量。這個 PATH 裡面就儲存了 Shell 中執行的指令的搜尋路徑。
檢視PATH環境變量路徑:
echo $PATH
其中給出的路徑存放可執行檔案,當在shell中執行指令時,系統就會安裝PATH中設定的路徑依次到目錄中查找,如果找到同名檔案,則執行先找到的檔案。
建立Shell腳本
建立腳本檔案,并打開
gedit hello_world.sh
在打開的文本中輸入:
#! /bin/bash //該行不是注釋,不能少
for((i=0; i<10; i++));do
echo "hello world"
done
exit 0
為檔案添加可執行權限
chmod 755 hello_shell.sh
執行腳本
./hello_shell.sh
建立C語言程式
建立并打開一個檔案
gidit hello_world.c
在文本中輸入
#include <stdio.h>
int main(void)
{
printf("hello world");
return 0;
}
儲存後,使用gcc生成可執行檔案:
gcc -o hello_world hello_world.c
gcc生成二進制檔案預設具有可執行檔案,不需修改
在/目前目錄修建立一個目錄
mybin
,并将上述檔案移動到其中
mkdir mybin
mv hello_shell.sh hello_world mybin/
并進入
mybin
目錄,運作上述兩個程式:
cd mybin
./hello_shell.sh
./hello_world
回到上一級目錄,再運作程式,則發現提示指令找不到,除非加上指令的完整路徑,但比較麻煩,可以進該路徑添加到PATH環境變量。
添加自定義路徑到“PATH”環境變量
PATH=$PATH:/home/shiyanlou/mybin
=
之前之後不能添加空格,否則會提示變量不存在
注意:路徑必須是絕對路徑
這樣在任意目錄中,都可以執行上述兩個檔案,直接輸入檔案名即可執行。
到此,如果退出終端,再打開則會發現失效,可以添加一種自動執行的方式:
在每個使用者的 home 目錄中有一個 Shell 每次啟動時會預設執行一個配置腳本,以初始化環境,包括添加一些使用者自定義環境變量等等。zsh 的配置檔案是
.zshrc
,相應 Bash 的配置檔案為
.bashrc
。它們在
etc
下還都有一個或多個全局的配置檔案,不過我們一般隻修改使用者目錄下的配置檔案。
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述指令中 >> 表示将标準輸出以追加的方式重定向到一個檔案中,注意前面用到的 > 是以覆寫的方式重定向到一個檔案中,使用的時候一定要注意分辨。在指定檔案不存在的情況下都會建立新的檔案。
變量修改和删除
變量的修改有以下幾種方式:
變量設定方式 | 說明 |
---|---|
${變量名#比對字串} | 從頭向後開始比對,删除符合比對字串的最短資料 |
${變量名##比對字串} | 從頭向後開始比對,删除符合比對字串的最長資料 |
${變量名%比對字串} | 從尾向前開始比對,删除符合比對字串的最短資料 |
${變量名%%比對字串} | 從尾向前開始比對,删除符合比對字串的最長資料 |
${變量名/舊的字串/新的字串} | 将符合舊字串的第一個字串替換為新的字串 |
${變量名//舊的字串/新的字串} | 将符合舊字串的全部字串替換為新的字串 |
變量删除
unset temp
環境變量立即 生效
在 Shell 中修改了一個配置腳本檔案之後(比如 zsh 的配置檔案 home 目錄下的 .zshrc),每次都要退出終端重新打開甚至重新開機主機之後其才能生效,很是麻煩,我們可以使用 source 指令來讓其立即生效,如:
source .zshrcc
source
指令還有一個别名就是
.
,注意與表示目前路徑的那個點區分開,雖然形式不一樣,但作用和使用方式一樣,上面的指令如果替換成
.
的方式就該是:
. ./.zshrc
注意第一個點之後必須有個空格,而且後面的檔案必須指定完整的絕對或相對路徑名,source 則不需要。
搜尋檔案
與搜尋相關的指令常用的有 whereis,which,find 和 locate 。
whereis簡單快捷
whereis find

找到了三個路徑,兩個可執行檔案路徑和一個 man 線上幫助檔案所在路徑,這個搜尋很快,因為它并沒有從硬碟中依次查找,而是直接從資料庫中查詢。whereis 隻能搜尋二進制檔案(-b),man 幫助檔案(-m)和源代碼檔案(-s)。如果想要獲得更全面的搜尋結果可以使用 locate 指令。
locate快而全
通過“ /var/lib/mlocate/mlocate.db ”資料庫查找,不過這個資料庫也不是實時更新的,系統會使用定時任務每天自動執行 updatedb 指令更新一次,是以有時候你剛添加的檔案,它可能會找不到,需要手動執行一次 updatedb 指令(在我們的環境中必須先執行一次該指令)。
locate 檔案名
安裝軟體包:
yum install mlocate
which小而精
which
本身是
Shell
内建的一個指令,通常使用
which
來确定是否安裝了某個指定的軟體,因為它隻從 PATH 環境變量指定的路徑中去搜尋指令:
which man
find精而細
find 應該是這幾個指令中最強大的了,它不但可以通過檔案類型、檔案名進行查找而且可以根據檔案的屬性(如檔案的時間戳,檔案的權限等)進行搜尋。
find / -name 檔案名 //w檔案名查找
find /etc/ -name interfaces //表示去 /etc/ 目錄下面 ,搜尋名字叫做 interfaces 的檔案或者目錄。
**
注意** find 指令的路徑是作為第一個參數的, 基本指令格式為
find [path] [option] [action]
。
與時間相關的指令參數:
參數 | 說明 |
---|---|
-atime | 最後通路時間 |
-ctime | 最後修改檔案内容的時間 |
-mtime | 最後修改檔案屬性的時間 |
下面以 -mtime 參數舉例:
-
為數字,表示為在 n 天之前的“一天之内”修改過的檔案-mtime n:n
-
:列出在 n 天之前(不包含 n 天本身)被修改過的檔案-mtime +n
-
:列出在 n 天之内(包含 n 天本身)被修改過的檔案-mtime -n
-
-newer file
:file 為一個已存在的檔案,列出比 file 還要新的檔案名
find ~ -mtime 0 //查找當天(24小時之内)右改動的檔案
find ~ -newer /home/shiyanlou/Code //列出目錄下比 Code 檔案夾新的檔案
以上内容來自:實驗樓