一、環境變量
變量
這裏所指的變量(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環境變量了。
- 第一步:C語言程序 hello.c:輸出hello world!
添加自定義路徑到“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