1. 程式人生 > >實驗樓 環境變量與文件查找

實驗樓 環境變量與文件查找

等等 顯示 如何 三種 技術 文件查找 export 家目錄 ron

一、環境變量

1. 變量

使用 declare 命令創建一個變量名為 tmp 的變量

declare tmp

使用 = 號賦值運算符,將變量 tmp 賦值為 shiyanlou

tmp=shiyanlou

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

echo $tmp

2. 環境變量

Shell 的環境變量作用於自身和它的子進程。在所有的 UNIX 和類 UNIX 系統中,每個進程都有其各自的環境變量設置,且默認情況下,當一個進程被創建時,除了創建過程中明確指定的話,它將繼承其父進程的絕大部分環境設置。Shell 程序也作為一個進程運行在操作系統之上,而我們在 Shell 中運行的大部分命令都將以 Shell 的子進程的方式運行

通常我們會涉及到的變量類型有三種:

  • 當前 Shell 進程私有用戶自定義變量,如上面我們創建的 tmp 變量,只在當前 Shell 中有效。
  • Shell 本身內建的變量。
  • 從自定義變量導出的環境變量
命 令說 明
set 顯示當前 Shell 所有變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量。
env 顯示與當前用戶相關的環境變量,還可以讓命令在指定環境中運行。
export 顯示從 Shell 中導出成環境變量的變量,也能通過它將自定義變量導出為環境變量。

技術分享

我認為:環境變量相當於全局變量,變量相當於局部變量,set、env、export對局部變量進行不同程度的作用域的擴大

註意:為了與普通變量區分,通常我們習慣將環境變量名設為大寫。

永久生效

按變量的生存周期來劃分,Linux 變量可分為兩類:

  1. 永久的:需要修改配置文件,變量永久生效;

  2. 臨時的:使用 export 命令行聲明即可,變量在關閉 shell 時失效。

/etc/bashrc(有的 Linux 沒有這個文件) 和 /etc/profile ,它們分別存放的是 shell 變量和環境變量

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

當我們在 Shell 中執行一個命令時,系統就會按照 PATH 中設定的路徑按照順序依次到目錄中去查找,如果存在同名的命令,則執行先找到的那個

http://www.shiyanlou.com/courses/57

http://www.shiyanlou.com/courses/5

http://bash.cyberciti.biz/guide/Main_Page

創建一個 Shell 腳本文件:

gedit hello_shell.sh

#!/bin/bash

for ((i=0; i<10; i++));do
    echo "hello shell"
done

exit 0

為文件添加可執行權限:
chmod 755 hello_shell.sh

執行文件
./hello_shell.sh

創建一個 C 語言“ hello world ”程序:
gedit hello_world.c

#include <stdio.h>

int main(void)
{
    printf("hello world!\n");
    return 0;
}

保存後使用 gcc 生成可執行文件
gcc -o hello_world hello_world.c
gcc 生成二進制文件默認具有可執行權限,不需要修改

4. 添加自定義路徑到“ PATH ”環境變量

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

註意這裏一定要使用絕對路徑。

是在當前 Shell 有效,我一旦退出終端,再打開就會發現又失效了。

在每個用戶的 home 目錄中有一個 Shell 每次啟動時會默認執行一個配置腳本,以初始化環境,包括添加一些用戶自定義環境變量等等。zsh 的配置文件是 .zshrc,相應 Bash 的配置文件為 .bashrc
$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中 >> 表示將標準輸出以追加的方式重定向到一個文件中

5. 修改和刪除已有變量

變量修改

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

將符合舊字串的全部字串替換為新的字串


變量刪除

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

unset temp

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

前面我們在 Shell 中修改了一個配置腳本文件之後(比如 zsh 的配置文件 home 目錄下的 .zshrc),每次都要退出終端重新打開甚至重啟主機之後其才能生效,很是麻煩,我們可以使用 source 命令來讓其立即生效,如

source .zshrc

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

. ./.zshrc

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

二、搜索文件

與搜索相關的命令常用的有 whereiswhichfindlocate

whereis 簡單快速

這個搜索很快,因為它並沒有從硬盤中依次查找,而是直接從數據庫中查詢。whereis 只能搜索二進制文件(-b),man 幫助文件(-m)和源代碼文件(-s)。

locate 快而全

通過“ /var/lib/mlocate/mlocate.db ”數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務每天自動執行 updatedb 命令更新一次,所以有時候你剛添加的文件,它可能會找不到,需要手動執行一次 updatedb 命令(在我們的環境中必須先執行一次該命令)。它可以用來查找指定目錄下的不同文件類型,如查找 /etc 下所有以 sh 開頭的文件

locate /etc/sh

查找 /usr/share/ 下所有 jpg 文件:

locate /user/share/\*.jpg

註意要添加 * 號前面的反斜杠轉義,否則會無法找到。

如果想只統計數目可以加上 -c 參數,-i 參數可以忽略大小寫進行查找,whereis 的 -b-m-s 同樣可以使用。

which 小而精

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

find 精而細

功能強大

這條命令表示去 /etc/ 目錄下面 ,搜索名字叫做 interfaces 的文件或者目錄。這是 find 命令最常見的格式,千萬記住 find 的第一個參數是要搜索的地方

sudo find /etc/ -name interfaces

與時間相關的命令參數:

參數說明
-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

列出用戶家目錄下比 Code 文件夾新的文件:

$ find ~ -newer /home/shiyanlou/Code

四、作業

locate /etc/\*.jpg

實驗樓 環境變量與文件查找