天天看點

環境變量與檔案查找環境變量搜尋檔案

介紹環境變量的作用與用法,及幾種搜尋檔案的方法。學會這些技巧可以高效地使用 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 參數舉例:

  • -mtime n:n

    為數字,表示為在 n 天之前的“一天之内”修改過的檔案
  • -mtime +n

    :列出在 n 天之前(不包含 n 天本身)被修改過的檔案
  • -mtime -n

    :列出在 n 天之内(包含 n 天本身)被修改過的檔案
  • -newer file

    :file 為一個已存在的檔案,列出比 file 還要新的檔案名

    find ~ -mtime 0 //查找當天(24小時之内)右改動的檔案

    find ~ -newer /home/shiyanlou/Code //列出目錄下比 Code 檔案夾新的檔案

以上内容來自:實驗樓

繼續閱讀