目錄
- 環境變量
-
- 變量修改
- 變量删除
- 檔案查找
-
- whereis
- locate
- which
- find
環境變量
通常我們會涉及到的變量類型有三種:
- 目前 Shell 程序私有使用者自定義變量,如上面我們建立的 tmp 變量,隻在目前 Shell 中有效。
- Shell 本身内建的變量。
- 從自定義變量導出的環境變量。
也有三個與上述三種環境變量相關的指令:set,env,export。這三個指令很相似,都是用于列印環境變量資訊,差別在于涉及的變量範圍不同。詳見下表:
指令 | 說明 |
---|---|
set | 顯示目前 Shell 所有變量包括其内建環境變量(與 Shell 外觀等相關)使用者自定義變量及導出的環境變量。 |
env | 顯示與目前使用者相關的環境變量,還可以讓指令在指定環境中運作。 |
export | 顯示從 Shell 中導出成環境變量的變量,也能通過它将自定義變量導出為環境變量。 |
注意:為了與普通變量區分,通常我們習慣将環境變量名設為大寫。
按變量的生存周期來劃分,Linux 變量可分為兩類:
- 永久的:需要修改配置檔案,變量永久生效;
- 臨時的:使用 export 指令行聲明即可,變量在關閉 shell 時失效。
這裡介紹兩個重要檔案 /etc/bashrc(有的 Linux 沒有這個檔案) 和 /etc/profile ,它們分别存放的是 shell 變量和環境變量。還有要注意差別的是每個使用者目錄下的一個隐藏檔案:
# .profile 可以用 ls -a 檢視
cd /home/shiyanlou
ls -a
這個 .profile 隻對目前使用者永久生效。因為它儲存在目前使用者的 Home 目錄下,當切換使用者時,工作目錄可能一并被切換到對應的目錄中,這個檔案就無法生效。而寫在 /etc/profile 裡面的是對所有使用者永久生效,是以如果想要添加一個永久生效的環境變量,隻需要打開 /etc/profile,在最後加上你想添加的環境變量就好啦。
變量修改
變量的修改有以下幾種方式:
變量設定方式 | 說明 |
---|---|
${變量名#比對字串} | 從頭向後開始比對,删除符合比對字串的最短資料 |
${變量名##比對字串} | 從頭向後開始比對,删除符合比對字串的最長資料 |
${變量名%比對字串} | 從尾向前開始比對,删除符合比對字串的最短資料 |
${變量名%%比對字串} | 從尾向前開始比對,删除符合比對字串的最長資料 |
${變量名/舊的字串/新的字串} | 将符合舊字串的第一個字串替換為新的字串 |
${變量名//舊的字串/新的字串} | 将符合舊字串的全部字串替換為新的字串 |
變量删除
可以使用 unset 指令删除一個環境變量:
unset mypath
前面我們在 Shell 中修改了一個配置腳本檔案之後(比如 zsh 的配置檔案 home 目錄下的 .zshrc),每次都要退出終端重新打開甚至重新開機主機之後其才能生效,很是麻煩,我們可以使用 source 指令來讓其立即生效,如:
cd /home/shiyanlou
source .zshrc
檔案查找
與搜尋相關的指令常用的有 whereis,which,find 和 locate。
whereis
whereis 隻能搜尋二進制檔案(-b),man 幫助檔案(-m)和源代碼檔案(-s)。如果想要獲得更全面的搜尋結果可以使用 locate 指令。
locate
使用 locate 指令查找檔案也不會周遊硬碟,它通過查詢 /var/lib/mlocate/mlocate.db 資料庫來檢索資訊。不過這個資料庫也不是實時更新的,系統會使用定時任務每天自動執行 updatedb 指令來更新資料庫。是以有時候你剛添加的檔案,它可能會找不到,需要手動執行一次 updatedb 指令(在我們的環境中必須先執行一次該指令)。注意這個指令也不是内置的指令,在部分環境中需要手動安裝,然後執行更新。
它可以用來查找指定目錄下的不同檔案類型,如查找 /etc 下所有以 sh 開頭的檔案:
locate /etc/sh
注意,它不隻是在 /etc 目錄下查找,還會自動遞歸子目錄進行查找。
查找 /usr/share/ 下所有 jpg 檔案:
locate /usr/share/*.jpg
如果想隻統計數目可以加上 -c 參數,-i 參數可以忽略大小寫進行查找,whereis 的 -b、-m、-s 同樣可以使用。
which
which 本身是 Shell 内建的一個指令,我們通常使用 which 來确定是否安裝了某個指定的程式,因為它隻從 PATH 環境變量指定的路徑中去搜尋指令并且傳回第一個搜尋到的結果。也就是說,我們可以看到某個系統指令是否存在以及執行的到底是哪一個地方的指令。
find
find 應該是這幾個指令中最強大的了,它不但可以通過檔案類型、檔案名進行查找而且可以根據檔案的屬性(如檔案的時間戳,檔案的權限等)進行搜尋。
這條指令表示去 /etc/ 目錄下面 ,搜尋名字叫做 interfaces 的檔案或者目錄。這是 find 指令最常見的格式,千萬記住 find 的第一個參數是要搜尋的地方。指令前面加上 sudo 是因為 XXX隻是普通使用者,對 /etc 目錄下的很多檔案都沒有通路的權限,如果是 root 使用者則不用使用。
sudo find /etc/ -name interfaces
注意 find 指令的路徑是作為第一個參數的, 基本指令格式為 find [path][option] [action] 。
與時間相關的指令參數:
參數 | 說明 |
---|---|
-atime | 最後通路時間 |
-ctime | 最後修改檔案内容的時間 |
-mtime | 最後修改檔案屬性的時間 |
下面以 -mtime 參數舉例:
- -mtime n:n 為數字,表示為在 n 天之前的“一天之内”修改過的檔案
- -mtime +n:列出在 n 天之前(不包含 n 天本身)被修改過的檔案
- -mtime -n:列出在 n 天之内(包含 n 天本身)被修改過的檔案
- -newer file:file 為一個已存在的檔案,列出比 file 還要新的檔案名
列出 home 目錄中,當天(24 小時之内)有改動的檔案:
find ~ -mtime 0
列出使用者家目錄下比 /etc 目錄新的檔案:
find ~ -newer /etc