Linux成長之路(三)——環境變量和搜索文件

一、環境變量

  • 變量
    這裏所指的變量(Shell變量)可以看成編程語言中的變量,它也有自己的命名規則和變量類型,可以參與運算,有作用域限定。其實Shell本身也就是一種程序語言。
    使用“declare”命令創建一個變量:
    這裏寫圖片描述
    可能有的讀者會說declare命令似乎沒有存在的意義,其實它在創建其它指定類型的變量(如數組)時會用到。

  • 環境變量
    環境變量就是作用域比自定義變量要大,如Shell 的環境變量作用於自身和它的子進程。在所有的 UNIX 和類 UNIX 系統中,每個進程都有其各自的環境變量設置,且默認情況下,當一個進程被創建時,處理創建過程中明確指定的話,它將繼承其父進程的絕大部分環境設置。Shell 程序也作爲一個進程運行在操作系統之上,而我們在 Shell中運行的大部分命令都將以 Shell 的子進程的方式運行。
    這裏寫圖片描述
    (圖片來自實驗樓)

    通常我們會涉及到的環境變量有三種:

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

    也有三個與上述三種環境變量相關的命令,set,env,export。這三個命令很相似,都可以用於打印相關環境變量,區別在於涉及的是不同範圍的環境變量,詳見下表:
    這裏寫圖片描述
    這裏寫圖片描述

    關於環境變量,可以簡單的理解成在當前進程的子進程是否有效,有效則爲環境變量,否則不是。

    不懂什麼意思?不要緊,看到這兒我也一臉懵逼,再往後看。

    我們這裏用export命令來體會一下,先在 Shell 中設置一個變量father,然後再新創建一個子 Shell 查看father變量的值:
    這裏寫圖片描述
    解釋:可以理解爲【father=45】爲一個普通變量,而【export father=50】爲導出father爲環境變量。
    注意:Ubuntu默認Shell爲bash,有bash,ksh,csh,tsh,zsh,置於他們的不同可以在網上自己查查。
    爲了與普通變量區分,通常我們習慣將環境變量名設爲大寫

  • 命令的查找路徑與順序
    在Windows系統中,我們經常配置環境變量PATH,Linux中也一樣需要配置環境變量,我們在Shell中輸入的命令,也就是通過環境變量給的路徑去查找的。除了系統自帶的我們也可以自定義環境變量。
    查看環境變量:
    這裏寫圖片描述
    (注意環境變量和程序代碼中的變量一樣區分大小寫)
    上述目錄中的文件通常是一些可執行文件當我們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,如果存在同名的命令,則執行先找到的那個。

    實驗:我們先用C語言在用戶gcg家目錄下寫一個程序,再用gcc(C語言編譯器)編譯,在gcg家目錄中可以直接運行生成的可執行二進制文件,但是當返回上級目錄再 想運行可執行文件時卻找不到命令。

    • 第一步:C語言程序 hello.c:輸出hello world!
      這裏寫圖片描述
    • 第二步 :gcc編譯hello.c,gcc編譯後的二進制文件默認是可執行的。
      這裏寫圖片描述
    • 第三步:執行二進制文件hello:
      這裏寫圖片描述
    • 第四步:返回其他目錄再執行hello,找不到hello命令了:
      這裏寫圖片描述
      說明:加上命令的完整路徑可以執行hello命令,
      這裏寫圖片描述
      但那樣很不方便,如何做到想使用系統命令一樣執行自己創建的腳本
      文件或者程序呢?那就要將命令所在路徑添加到PATH環境變量了。
  • 添加自定義路徑到“PATH”環境變量
    先看看添加PATH之後運行可執行文件hello的效果:
    這裏寫圖片描述
    我們是怎麼做到的,其實就是在PATH變量後面跟着加上hello所在目錄的完整路徑,注意是完整路徑,直接上圖:
    這裏寫圖片描述

    問題來了:因爲添加的是PATH環境變量,所以我們用bash創建子Shell之後hello命令仍然有效,不過一旦關閉當前終端,在此進入,你會發現PATH中的加的:/home/gcg已經不存在了,而且hello也不能在其他目錄執行了。怎麼辦?

    解決方法:在每個用戶的 home 目錄中有一個 Shell 每次啓動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。 Bash 的配置文件爲.bashrc。它們在etc下還都有一個或多個全局的配置文件,不過我們一般只修改用戶目錄下的配置文件:
    這裏寫圖片描述
    (我試過了,添加後在.bashrc文件追後確實存在:/home/gcg/,不過不知道爲什麼,hello還是不能直接執行。)
    (補充: 後來我在是實驗樓上做了一遍,結果成功了,實驗樓的Shell是zsh,我用的Ubuntu是bash,當然前提是要重啓終端之後纔會生效)

  • 修改和刪除已有變量

    • 變量修改
      變量的修改主要是一下幾種方式:
      這裏寫圖片描述
      演示:
      從尾向前開始匹配:
      這裏寫圖片描述
      將符合舊字串全部替換爲新串
      這裏寫圖片描述

    • 變量刪除
      這裏寫圖片描述

  • 如何讓環境變量立即生效
    在上面我們在 Shell 中修改了一個配置腳本文件之後(比如 zsh 的配置文件 home 目錄下的.zshrc),每次都要退出終端重新打開甚至重啓主機之後其才能生效,很是麻煩,我們可以使用source命令來讓其立即生效(source命令也可以用“.”代替,注意”.”後面有一個空格,而且用“.”的話,後面必須是完整的路徑名或者相對路徑,而source則不需要)。

二、搜索文件

  • whereis簡單快捷
    whereis只能搜索二進制文件(-b),man幫助文件(-m)和源代碼文件(-s)

  • locate快而全
    通過”/var/lib/mlocate/mlocate.db”數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務每天自動執行updatedb命令更新一次,所以有時候你剛添加的文件,它可能會找不到,需要手動執行一次updatedb命令

  • which小而精
    which本身是 Shell 內建的一個命令,我們通常使用which來確定是否安裝了某個指定的軟件,因爲它只從PATH環境變量指定的路徑中去搜索命令

  • find精而細
    find應該是這幾個命令中最強大的了,它不但可以通過文件類型、文件名進行查找而且可以根據文件的屬性(如文件的時間戳,文件的權限等)進行搜索。
    這幾個命令都比較簡單,可以自己試試。

參考文獻:https://www.shiyanlou.com/courses/1

注:轉載請註明原文出處:
作者:CUG_UESTC
出處:http://blog.csdn.net/qq_31192383/article/details/52823199

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章