linux環境變量與文件查找

整理來自javascript

https://www.shiyanlou.com/courses/running/60java

要解釋環境變量,得先明白變量是什麼,準確的說應該是 Shell 變量,所謂變量就是計算機中用於記錄一個值(不必定是數值,也能夠是字符或字符串)的符號,而這些符號將用於不一樣的運算處理中。一般變量與值是一對一的關係,能夠經過表達式讀取它的值賦值給其它變量,也能夠直接指定數值賦值給任意變量。爲了便於運算和處理,大部分的編程語言會區分變量的類型,用於分別記錄數值、字符或者字符串等等數據類型。Shell 中的變量也基本如此,有不一樣類型(但不用專門指定類型名),能夠參與運算,有做用域限定。shell

在 Shell 中如何建立一個變量,如何給變量賦值和如何讀取變量的值呢?這部份內容會在bash 腳本編程這門課中詳細介紹,這裏我簡單舉例說明一下:數據庫

使用declare命令建立一個變量名爲 tmp 的變量:編程

$ declare tmp 

其實也能夠不用 declare 預聲明一個變量,直接即用即建立,這裏只是告訴你 declare 的做用,這在建立其它指定類型的變量(如數組)時會用到。vim

 

 

使用=號賦值運算符爲變量 tmp 賦值爲 shiyanlou:數組

$ tmp=shiyanlou 

 

讀取變量的值,使用echo命令和$符號($符號用於表示引用一個變量的值,初學者常常會忘記輸入):ruby

$ echo $tmp 

 

2.環境變量

 

簡單理解了變量的概念,就很好解釋環境變量了,環境變量就是做用域比自定義變量要大,如Shell 的環境變量做用於自身和它的子進程。在全部的 UNIX 和類 UNIX 系統中,每一個進程都有其各自的環境變量設置,且默認狀況下,當一個進程被建立時,處理建立過程當中明確指定的話,它將繼承其父進程的絕大部分環境設置。Shell 程序也做爲一個進程運行在操做系統之上,而咱們在 Shell中運行的大部分命令都將以 Shell 的子進程的方式運行。bash

 

一般咱們會涉及到的環境變量有三種:編程語言

  • 當前 Shell 進程私有用戶自定義變量,如上面咱們建立的 temp 變量,只在當前 Shell 中有效。
  • Shell 自己內建的變量。
  • 從自定義變量導出的環境變量。

也有三個與上述三種環境變量相關的命令,setenvexport。這三個命令很類似,均可以用於打印相關環境變量,區別在於涉及的是不一樣範圍的環境變量,詳見下表:

 

命令 說明
set 顯示當前 Shell 全部環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量
env 顯示與當前用戶相關的環境變量,還可讓命令在指定環境中運行
export 顯示從 Shell 中導出成環境變量的變量,也能經過它將自定義變量導出爲環境變量

你能夠更直觀的使用vimdiff工具比較一下它們之間的差異:

$ temp=shiyanlou

$ export temp_env=shiyanlou

$ env|sort>env.txt

$ export|sort>export.txt

$ set|sort>set.txt

上述操做將命令輸出經過管道|使用sort命令排序,再重定向到對象文本文件中。

$ vimdiff env.txt export.txt set.txt 

 

關於環境變量,能夠簡單的理解成在當前進程的子進程是否有效,有效則爲環境變量,不然不是(有些人也將全部變量統稱爲環境變量,只是以全局環境變量和局部環境變量進行區分,咱們只要理解它們的實質區別便可)。咱們這裏用export命令來體會一下,先在 Shell 中設置一個變量temp=shiyanlou,而後再新建立一個子 Shell 查看temp變量的值:

 

3.命令的查找路徑與順序

 

你可能很早以前就有疑問,咱們在 Shell 中輸入一個命令,Shell 是怎麼知道在哪去找到這個命令而後執行的呢?這是經過環境變量PATH來進行搜索的,熟悉 Windows 的用戶可能知道 Windows 中的也是有這麼一個 PATH 環境變量。這個PATH裏面就保存了Shell中執行的命令的搜索路徑。

 

查看PATH環境變量的內容:

$ echo $PATH 

 

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

 

若是你還記得咱們在 Linux 目錄結構那一節的內容,你就應該知道上面這些目錄下放的是哪一類文件了。一般這一類目錄下放的都是可執行文件,當咱們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,若是存在同名的命令,則執行先找到的那個。

下面咱們將練習建立一個最簡單的可執行 Shell 腳本和一個使用 C 語言建立的"hello world"程序,若是這兩部份內容你以前沒有學習過,那麼你能夠進行一個入門學習: C 語言入門教程 高級 Bash 腳本編程指南 Linux Shell Scripting Tutorial (LSST) v2.0

建立一個 Shell 腳本文件:    

$ vim hello_shell.sh 

 

在腳本中添加以下內容,保存並退出(注意不要省掉第一行,這不是註釋,論壇有用戶反應會有語法錯誤,就是由於沒有了第一行):

#!/bin/zsh

for ((i=0; i<10; i++));

do echo "hello shell"

done

exit

$ chmod 755 hello_shell.sh 

 

建立一個 C 語言"hello world"程序:

$ vim hello_world.c 
#include <stdio.h> int main(void) { printf("hello world!\n"); return 0; }

使用 gcc 生成可執行文件:

$ gcc -o hello_world hello_world.c 

gcc 生成二進制文件默認具備可執行權限,不須要修改

 

在 shiyanlou 家目錄建立一個mybin目錄,並將上述 hello_shell.sh 和 hello_world 文件移動到其中:

$ mkdir mybin $ mv hello_shell.sh hello_world mybin/ 

如今你能夠在mybin目錄中分別運行你剛剛建立的兩個程序:

$ cd mybin $ ./hello_shell.sh $ ./hello_world
 
 

回到上一級目錄,也就是shiyanlou家目錄,當再想運行那兩個程序時,會發現提示命令找不到,除非加上命令的完整路徑,但那樣很不方便,如何作到想使用系統命令同樣執行本身建立的腳本文件或者程序呢?那就要將命令所在路徑添加到PATH環境變量了

4.添加自定義路徑到「PATH」環境變量

在前面咱們應該注意到PATH裏面的路徑是以做爲分割符,因此咱們能夠這樣添加自定義路徑:

$ PATH=$PATH:/home/shiyanlou/mybin 

 

注意這裏必定要使用絕對路徑

 

如今你就能夠在其餘任意目錄執行那兩個命令了。你可能會意識到這樣還並無很好的解決問題,由於我給 PATH 環境變量追加了一個路徑,它也只是在當前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。有沒有方法讓添加的環境變量全局有效?或者每次啓動 Shell 時自動執行上面添加自定義路徑到 PATH 的命令?下面咱們就來講說後一種方式——讓它自動執行。

 

在每一個用戶的 home 目錄中有一個 Shell 每次啓動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。zsh 的配置文件是.zshrc,相應 Bash 的配置文件爲.bashrc。它們在etc下還都有一個或多個全局的配置文件,不過咱們通常只修改用戶目錄下的配置文件。

 

咱們能夠簡單的使用下面命令直接添加內容到.zshrc中:

$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc 

 

上述命令中>>表示將標準輸出以追加的方式重定向到一個文件中,注意前面用到的>是以覆蓋的方式重定向到一個文件中,使用的時候必定要注意分辨。在指定文件不存在的狀況下都會建立新的文件。

 

5.修改和刪除已有變量

 

變量修改

變量的修改有如下幾種方式:

變量設置方式 說明
${變量名#匹配字串} 從頭向後開始匹配,刪除符合匹配字串的最短數據
${變量名##匹配字串} 從頭向後開始匹配,刪除符合匹配字串的最長數據
${變量名%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最短數據
${變量名%%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最長數據
${變量名/舊的字串/新的字串} 將符合舊字串的第一個字串替換爲新的字串
${變量名//舊的字串/新的字串} 將符合舊字串的所有字串替換爲新的字串

 

好比要修改咱們前面添加到 PATH 的環境變量。爲了不操做失誤致使命令找不到,咱們先將 PATH 賦值給一個新的自定義變量 path:

$ path=$PATH

$ echo $path

$ path=${path%/home/shiyanlou/mybin}

# 或使用通配符,*表示任意多個任意字符

$ path=${path%*/mybin}

變量刪除

可使用unset命令刪除一個環境變量:




$ unset temp

6.如何讓環境變量當即生效

 

在上面咱們在 Shell 中修改了一個配置腳本文件以後(好比 zsh 的配置文件 home 目錄下的.zshrc),每次都要退出終端從新打開甚至重啓主機以後其才能生效,非常麻煩,咱們可使用source命令來讓其當即生效,如:

$ source .zshrc 

 

source命令還有一個別名就是.,注意與表示當前路徑的那個點區分開,雖然形式同樣,但做用和使用方式同樣,上面的命令若是替換成.的方式就該是

$ . ./.zshrc 

注意第一個點後面有一個空格,並且後面的文件必須指定完整的絕對或相對路徑名,source 則不須要。

 

2、搜索文件

 

與搜索相關的命令經常使用的有以下幾個whereis,which,find,locate

  • whereis簡單快速
    $whereis who 

     

    你會看到它找到了三個路徑,兩個可執行文件路徑和一個 man 在線幫助文件所在路徑,這個搜索很快,由於它並無從硬盤中依次查找,而是直接從數據庫中查詢。whereis只能搜索二進制文件(-b),man幫助文件(-m)和源代碼文件(-s)。若是想要得到更全面的搜索結果可使用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環境變量指定的路徑中去搜索命令:



$ which man
  • find精而細

find應該是這幾個命令中最強大的了,它不但能夠經過文件類型、文件名進行查找並且能夠根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。find命令強大到,要把它將明白至少須要單獨好幾節課程才行,咱們這裏只介紹一些經常使用的內容。

在指定目錄下搜索指定文件名的文件:

$ find /etc/ -name interfaces 

注意 find 命令的路徑是做爲第一個參數的, 基本命令格式爲 find [path] [option] [action]

 

 

與時間相關的命令參數:

參數 說明
-atime 最後訪問時間
-ctime 建立時間
-mtime 最後修改時間

 

 

列出 home 目錄中,當天(24 小時以內)有改動的文件:

$ find ~ -mtime 0 

 

列出用戶家目錄下比Documents/test.c~文件新的文件:

$ find ~ -newer Documents/test.c\~ 
相關文章
相關標籤/搜索