日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux环境变量与文件查找

發(fā)布時(shí)間:2024/9/5 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux环境变量与文件查找 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

整理來自

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

要解釋環(huán)境變量,得先明白變量是什么,準(zhǔn)確的說應(yīng)該是 Shell 變量,所謂變量就是計(jì)算機(jī)中用于記錄一個(gè)值(不一定是數(shù)值,也可以是字符或字符串)的符號(hào),而這些符號(hào)將用于不同的運(yùn)算處理中。通常變量與值是一對(duì)一的關(guān)系,可以通過表達(dá)式讀取它的值賦值給其它變量,也可以直接指定數(shù)值賦值給任意變量。為了便于運(yùn)算和處理,大部分的編程語言會(huì)區(qū)分變量的類型,用于分別記錄數(shù)值、字符或者字符串等等數(shù)據(jù)類型。Shell 中的變量也基本如此,有不同類型(但不用專門指定類型名),可以參與運(yùn)算,有作用域限定。

在 Shell 中如何創(chuàng)建一個(gè)變量,如何給變量賦值和如何讀取變量的值呢?這部分內(nèi)容會(huì)在bash 腳本編程這門課中詳細(xì)介紹,這里我簡(jiǎn)單舉例說明一下:

使用declare命令創(chuàng)建一個(gè)變量名為 tmp 的變量:

$ declare tmp

其實(shí)也可以不用 declare 預(yù)聲明一個(gè)變量,直接即用即創(chuàng)建,這里只是告訴你 declare 的作用,這在創(chuàng)建其它指定類型的變量(如數(shù)組)時(shí)會(huì)用到。

?

?

使用=號(hào)賦值運(yùn)算符為變量 tmp 賦值為 shiyanlou:

$ tmp=shiyanlou

?

讀取變量的值,使用echo命令和$符號(hào)($符號(hào)用于表示引用一個(gè)變量的值,初學(xué)者經(jīng)常會(huì)忘記輸入):

$ echo $tmp

?

2.環(huán)境變量

?

簡(jiǎn)單理解了變量的概念,就很好解釋環(huán)境變量了,環(huán)境變量就是作用域比自定義變量要大,如Shell 的環(huán)境變量作用于自身和它的子進(jìn)程。在所有的 UNIX 和類 UNIX 系統(tǒng)中,每個(gè)進(jìn)程都有其各自的環(huán)境變量設(shè)置,且默認(rèn)情況下,當(dāng)一個(gè)進(jìn)程被創(chuàng)建時(shí),處理創(chuàng)建過程中明確指定的話,它將繼承其父進(jìn)程的絕大部分環(huán)境設(shè)置。Shell 程序也作為一個(gè)進(jìn)程運(yùn)行在操作系統(tǒng)之上,而我們?cè)?Shell中運(yùn)行的大部分命令都將以 Shell 的子進(jìn)程的方式運(yùn)行。

?

通常我們會(huì)涉及到的環(huán)境變量有三種:

  • 當(dāng)前 Shell 進(jìn)程私有用戶自定義變量,如上面我們創(chuàng)建的 temp 變量,只在當(dāng)前 Shell 中有效。
  • Shell 本身內(nèi)建的變量。
  • 從自定義變量導(dǎo)出的環(huán)境變量。

也有三個(gè)與上述三種環(huán)境變量相關(guān)的命令,set,env,export。這三個(gè)命令很相似,都可以用于打印相關(guān)環(huán)境變量,區(qū)別在于涉及的是不同范圍的環(huán)境變量,詳見下表:

?

命令說明
set顯示當(dāng)前 Shell 所有環(huán)境變量,包括其內(nèi)建環(huán)境變量(與 Shell 外觀等相關(guān)),用戶自定義變量及導(dǎo)出的環(huán)境變量
env顯示與當(dāng)前用戶相關(guān)的環(huán)境變量,還可以讓命令在指定環(huán)境中運(yùn)行
export顯示從 Shell 中導(dǎo)出成環(huán)境變量的變量,也能通過它將自定義變量導(dǎo)出為環(huán)境變量

你可以更直觀的使用vimdiff工具比較一下它們之間的差別:

$ temp=shiyanlou

$ export temp_env=shiyanlou

$ env|sort>env.txt

$ export|sort>export.txt

$ set|sort>set.txt

上述操作將命令輸出通過管道|使用sort命令排序,再重定向到對(duì)象文本文件中。

$ vimdiff env.txt export.txt set.txt

?

關(guān)于環(huán)境變量,可以簡(jiǎn)單的理解成在當(dāng)前進(jìn)程的子進(jìn)程是否有效,有效則為環(huán)境變量,否則不是(有些人也將所有變量統(tǒng)稱為環(huán)境變量,只是以全局環(huán)境變量和局部環(huán)境變量進(jìn)行區(qū)分,我們只要理解它們的實(shí)質(zhì)區(qū)別即可)。我們這里用export命令來體會(huì)一下,先在 Shell 中設(shè)置一個(gè)變量temp=shiyanlou,然后再新創(chuàng)建一個(gè)子 Shell 查看temp變量的值:

?

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

?

你可能很早之前就有疑問,我們?cè)?Shell 中輸入一個(gè)命令,Shell 是怎么知道在哪去找到這個(gè)命令然后執(zhí)行的呢?這是通過環(huán)境變量PATH來進(jìn)行搜索的,熟悉 Windows 的用戶可能知道 Windows 中的也是有這么一個(gè) PATH 環(huán)境變量。這個(gè)PATH里面就保存了Shell中執(zhí)行的命令的搜索路徑。

?

查看PATH環(huán)境變量的內(nèi)容:

$ echo $PATH

?

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

?

如果你還記得我們?cè)?Linux 目錄結(jié)構(gòu)那一節(jié)的內(nèi)容,你就應(yīng)該知道上面這些目錄下放的是哪一類文件了。通常這一類目錄下放的都是可執(zhí)行文件,當(dāng)我們?cè)?Shell 中執(zhí)行一個(gè)命令時(shí),系統(tǒng)就會(huì)按照 PATH 中設(shè)定的路徑按照順序依次到目錄中去查找,如果存在同名的命令,則執(zhí)行先找到的那個(gè)。

下面我們將練習(xí)創(chuàng)建一個(gè)最簡(jiǎn)單的可執(zhí)行 Shell 腳本和一個(gè)使用 C 語言創(chuàng)建的"hello world"程序,如果這兩部分內(nèi)容你之前沒有學(xué)習(xí)過,那么你可以進(jìn)行一個(gè)入門學(xué)習(xí):?C 語言入門教程?高級(jí) Bash 腳本編程指南?Linux Shell Scripting Tutorial (LSST) v2.0

創(chuàng)建一個(gè) Shell 腳本文件:    

$ vim hello_shell.sh

?

在腳本中添加如下內(nèi)容,保存并退出(注意不要省掉第一行,這不是注釋,論壇有用戶反應(yīng)會(huì)有語法錯(cuò)誤,就是因?yàn)闆]有了第一行):

#!/bin/zsh

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

do echo "hello shell"

done

exit

$ chmod 755 hello_shell.sh

?

創(chuàng)建一個(gè) C 語言"hello world"程序:

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

使用 gcc 生成可執(zhí)行文件:

$ gcc -o hello_world hello_world.c

gcc 生成二進(jìn)制文件默認(rèn)具有可執(zhí)行權(quán)限,不需要修改

?

在 shiyanlou 家目錄創(chuàng)建一個(gè)mybin目錄,并將上述 hello_shell.sh 和 hello_world 文件移動(dòng)到其中:

$ mkdir mybin $ mv hello_shell.sh hello_world mybin/

現(xiàn)在你可以在mybin目錄中分別運(yùn)行你剛剛創(chuàng)建的兩個(gè)程序:

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

回到上一級(jí)目錄,也就是shiyanlou家目錄,當(dāng)再想運(yùn)行那兩個(gè)程序時(shí),會(huì)發(fā)現(xiàn)提示命令找不到,除非加上命令的完整路徑,但那樣很不方便,如何做到想使用系統(tǒng)命令一樣執(zhí)行自己創(chuàng)建的腳本文件或者程序呢?那就要將命令所在路徑添加到PATH環(huán)境變量了

4.添加自定義路徑到“PATH”環(huán)境變量

在前面我們應(yīng)該注意到PATH里面的路徑是以:作為分割符,所以我們可以這樣添加自定義路徑:

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

?

注意這里一定要使用絕對(duì)路徑

?

現(xiàn)在你就可以在其他任意目錄執(zhí)行那兩個(gè)命令了。你可能會(huì)意識(shí)到這樣還并沒有很好的解決問題,因?yàn)槲医o PATH 環(huán)境變量追加了一個(gè)路徑,它也只是在當(dāng)前 Shell 有效,我一旦退出終端,再打開就會(huì)發(fā)現(xiàn)又失效了。有沒有方法讓添加的環(huán)境變量全局有效?或者每次啟動(dòng) Shell 時(shí)自動(dòng)執(zhí)行上面添加自定義路徑到 PATH 的命令?下面我們就來說說后一種方式——讓它自動(dòng)執(zhí)行。

?

在每個(gè)用戶的 home 目錄中有一個(gè) Shell 每次啟動(dòng)時(shí)會(huì)默認(rèn)執(zhí)行一個(gè)配置腳本,以初始化環(huán)境,包括添加一些用戶自定義環(huán)境變量等等。zsh 的配置文件是.zshrc,相應(yīng) Bash 的配置文件為.bashrc。它們?cè)趀tc下還都有一個(gè)或多個(gè)全局的配置文件,不過我們一般只修改用戶目錄下的配置文件。

?

我們可以簡(jiǎn)單的使用下面命令直接添加內(nèi)容到.zshrc中:

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

?

上述命令中>>表示將標(biāo)準(zhǔn)輸出以追加的方式重定向到一個(gè)文件中,注意前面用到的>是以覆蓋的方式重定向到一個(gè)文件中,使用的時(shí)候一定要注意分辨。在指定文件不存在的情況下都會(huì)創(chuàng)建新的文件。

?

5.修改和刪除已有變量

?

變量修改

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

變量設(shè)置方式說明
${變量名#匹配字串}從頭向后開始匹配,刪除符合匹配字串的最短數(shù)據(jù)
${變量名##匹配字串}從頭向后開始匹配,刪除符合匹配字串的最長(zhǎng)數(shù)據(jù)
${變量名%匹配字串}從尾向前開始匹配,刪除符合匹配字串的最短數(shù)據(jù)
${變量名%%匹配字串}從尾向前開始匹配,刪除符合匹配字串的最長(zhǎng)數(shù)據(jù)
${變量名/舊的字串/新的字串}將符合舊字串的第一個(gè)字串替換為新的字串
${變量名//舊的字串/新的字串}將符合舊字串的全部字串替換為新的字串

?

比如要修改我們前面添加到 PATH 的環(huán)境變量。為了避免操作失誤導(dǎo)致命令找不到,我們先將 PATH 賦值給一個(gè)新的自定義變量 path:

$ path=$PATH

$ echo $path

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

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

$ path=${path%*/mybin}

變量刪除

可以使用unset命令刪除一個(gè)環(huán)境變量:

$ unset temp


6.如何讓環(huán)境變量立即生效

?

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

$ source .zshrc

?

source命令還有一個(gè)別名就是.,注意與表示當(dāng)前路徑的那個(gè)點(diǎn)區(qū)分開,雖然形式一樣,但作用和使用方式一樣,上面的命令如果替換成.的方式就該是

$ . ./.zshrc

注意第一個(gè)點(diǎn)后面有一個(gè)空格,而且后面的文件必須指定完整的絕對(duì)或相對(duì)路徑名,source 則不需要。

?

二、搜索文件

?

與搜索相關(guān)的命令常用的有如下幾個(gè)whereis,which,find,locate。

  • whereis簡(jiǎn)單快速 $whereis who

    ?

    你會(huì)看到它找到了三個(gè)路徑,兩個(gè)可執(zhí)行文件路徑和一個(gè) man 在線幫助文件所在路徑,這個(gè)搜索很快,因?yàn)樗]有從硬盤中依次查找,而是直接從數(shù)據(jù)庫中查詢。whereis只能搜索二進(jìn)制文件(-b),man幫助文件(-m)和源代碼文件(-s)。如果想要獲得更全面的搜索結(jié)果可以使用locate命令。

  • locate快而全

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

$ locate /etc/sh

注意,它不只是在 etc 目錄下查找并會(huì)自動(dòng)遞歸子目錄進(jìn)行查找

?

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

?

$ locate /usr/share/\*.jpg

注意要添加*號(hào)前面的反斜杠轉(zhuǎn)義,否則會(huì)無法找到

如果想只統(tǒng)計(jì)數(shù)目可以加上-c參數(shù),-i參數(shù)可以忽略大小寫進(jìn)行查找,whereis 的-b,-m,-s同樣可以是使用。         

     

  • which小而精

which本身是 Shell 內(nèi)建的一個(gè)命令,我們通常使用which來確定是否安裝了某個(gè)指定的軟件,因?yàn)樗粡腜ATH環(huán)境變量指定的路徑中去搜索命令:

$ which man

  • find精而細(xì)

find應(yīng)該是這幾個(gè)命令中最強(qiáng)大的了,它不但可以通過文件類型、文件名進(jìn)行查找而且可以根據(jù)文件的屬性(如文件的時(shí)間戳,文件的權(quán)限等)進(jìn)行搜索。find命令強(qiáng)大到,要把它將明白至少需要單獨(dú)好幾節(jié)課程才行,我們這里只介紹一些常用的內(nèi)容。

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

$ find /etc/ -name interfaces

注意 find 命令的路徑是作為第一個(gè)參數(shù)的, 基本命令格式為 find [path] [option] [action]

?

?

與時(shí)間相關(guān)的命令參數(shù):

參數(shù)說明
-atime最后訪問時(shí)間
-ctime創(chuàng)建時(shí)間
-mtime最后修改時(shí)間

?

?

列出 home 目錄中,當(dāng)天(24 小時(shí)之內(nèi))有改動(dòng)的文件:

$ find ~ -mtime 0

?

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

$ find ~ -newer Documents/test.c\~

?

?

?

?

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/wind90/p/4605371.html

總結(jié)

以上是生活随笔為你收集整理的linux环境变量与文件查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。