source命令與“.”點命令_第1頁
source命令與“.”點命令_第2頁
source命令與“.”點命令_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、source命令與“.”點命令source命令是 bash shell的內(nèi)置命令,從C Shell而來。source命令的另一種寫法是點符號,用法和source相同,從Bourne Shell而來。source命令可以強行讓一個腳本去立即影響當前的環(huán)境。source命令會強制執(zhí)行腳本中的全部命令,而忽略文件的權限。source命令通常用于重新執(zhí)行剛修改的初始化文件,如.bash_profile和.profile等等。source命令可以影響執(zhí)行腳本的父shell的環(huán)境,而export則只能影響其 子shell的環(huán)境。使用方法舉例:$source /.bashrc或者:$. /.bashrc執(zhí)行

2、后/.bashrc中的內(nèi)容立即生效。一個典型的用處是,在使用An droid的mm等相關命令時,需要先執(zhí)行以下命令:$cd <an droid source path>$source ./build/e nvsetup.sh或者 $. ./build/e nvsetup.shsource命令(從 C Shell而來)是bash shell的內(nèi)置命令。點命令,就是個點符號,(從BourneShell而來)是source的另一名稱。同樣的,當前腳本中設置的變量也將作為腳本的環(huán)境,source(或點)命令通常用于重新執(zhí)行剛修改的初始化文件,女口 .bash profile禾口 .prof

3、ile 等等。例如,如果在登錄后對 .bash_profile中的EDITER和TERM 變量做了修改,則能用source 命令重新執(zhí)行.bash_profile中的命令而不用注銷并重新登錄。source命令的作用就是用來執(zhí)行一個腳本,那么:source a.sh同直接執(zhí)行 ./a.sh有什么不同呢,比如你在一個腳本里export $KKK=111 ,如果你用./a.sh執(zhí)行該腳本,執(zhí)行完畢后,你運行echo $KKK ,發(fā)現(xiàn)沒有值,如果你用source 來執(zhí)行,然后再echo就會發(fā)現(xiàn)KKK=111。因為調用./a.sh來執(zhí)行shell是在一個子shell里 運行的,所以執(zhí)行后,結果并沒有反應

4、到父shell里,不過source不同,他就是在本shell中執(zhí)行的,所以能看到結果。“.”點命令是shell的一個內(nèi)部命令,它從指定的 shell文件中讀入所有命令語句并在 當前進程中執(zhí)行。 因此當多個shell進程(父子進程或無關進程均可)共享一組變量值時, 就可以將這些變量賦值語句定義到一個shell文件里,并在需要這些變量值的程序中使用點語句來引用這個shell文件,從而實現(xiàn)變量值共享(對這些變量值的修改僅涉及到這個shell文件)。但要注意的是,這個 shell文件不能包括含有位置參數(shù)的語句,即不能接受$1、$ 2等命令行參數(shù)。從上面可以看出,其實點命令相當于c語言里面的#inclu

5、de。點命令還有另一個寫法:source。下面我們將舉例來說明。我們先寫一個簡單的 shell腳本文件,暫且命名為filel吧:#! /bin/basha="hi"echo $a我們先來執(zhí)行一下這個shell腳本,打開終端,敲入: ./filel結果是什么,你應該也看到了吧:bash: ./filel: Permissi on denied為什么呢。我們先不管這個吧,先看一下,另一個結果:./filel (注意啊,兩個點之間有個空格的哦,要不就成了上一級目錄了,如果你不嫌麻 煩的話,也可以寫 source ./filel)這個的結果呢,跟前面就不一樣了,正如我們所愿的, 輸

6、出了 hi。./filel,直接執(zhí)行,需要 另起shell進程,而你似乎還沒有這個權限(這個改一下就0K了,后面再說),而用點命令就不一樣了(注意啊,./file這里的點可不是點命令里的點啊,我就被這個問題困擾了很久,汗死,竟然忘了點還有當前目錄的意思,大家b4我吧),點命令會在當前的shell下執(zhí)行。補充說一下怎么改一下file1的權限,讓我們可以在按shell腳本來執(zhí)行:chmod +x file1再執(zhí)行一下./file1,是不是OK 了?再來看另一個例子吧。首先腳本文件file1#! /bin/basha="hi"腳本文件file2 (與file1在同一個目錄下)#!

7、 /bin/bash./file1echo $a記得改一下file1的權限啊,要不./file1就沒法執(zhí)行了。執(zhí)行一下看看結果。什么都沒有, 是吧。我們再改一下 file2,這回用一下咱們的點命令#! /bi n/bash./filelecho $a怎么樣結果不一樣了吧。(原諒我實在太懶了,只能舉這么簡短的例子了,呵呵)。這個例子應該還是能說明點問題的吧。如果不用點命令的話,會另起shell進程,而啟動這個進行的時候,它會建立自己的進程環(huán)境(暫且這么叫它吧),然后在這個進行結束的時候,它所建立的環(huán)境也隨之被銷毀。而且點命令就不一樣了,它會把點命令所帶的shell腳本里的所以內(nèi)容帶到當前的 sh

8、ell進程里,在本程序里,就是變量a 了。廢話了這么多,其實好像把點命令想像成C里的#inelude就OK 了,呵呵。不過經(jīng)過這么折騰,還是學到了一點東西的,至少知道了不僅有點命令的作用,更有當前目錄的意思(冷啊,該補一下linux基礎了)。為什么在shell腳本里面export的環(huán)境變量,在 set里面竟然看不到。為什么在shell腳本里面用export設置環(huán)境變量之后,當shell執(zhí)行完了,用set命令看不到呢?但是你如果直接在終端里export環(huán)境變量用set是看到的。一個shell腳本test.sh的內(nèi)容為:#!/bi n/bashexport AA=123當我們執(zhí)行test.sh的時

9、候,是當前終端所在的shell fork 個子shell然后執(zhí)行test.sh的, 執(zhí)行完了再返回終端所在的shell。明白這點,就容易理解了,我們在 test.sh設置了 AA環(huán)境變量,它只在fork出來的這個子shell中生效,子shell只能繼承父shell的環(huán)境變量,而 不能修改父shell的環(huán)境變量,所以test.sh結束后,父進程的環(huán)境就覆蓋回去。所以在test.sh之后完之后,我們用set命令是看不了 AA這個環(huán)境變量的值的。那有什么辦法可以讓腳本的環(huán)境變量在腳本執(zhí)行之后仍然對當前終端存在呢?用sorcue或者.(dot)。明確告訴 shell不要fork執(zhí)行腳本,而是在當前的shell執(zhí)行,這樣環(huán)境變量就可以保存下來了。source命令用法:source File name (通常用“.”來代替)source test.sh 與 .test.sh 是等效的。【補充】source命令與shell scri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論