天天看點

Linux下source指令、點指令和./執行指令的不同

對于經常使用linux系統的同學而言,source filename與./filename應該是大家日常非常高頻使用的指令了,其實除了這兩個外,還有一個叫做點指令的東西,那麼這幾者之間有什麼差別和聯系呢?日常工作學習中,我們又什麼時候會用到這些指令符号呢?

Linux下source指令、點指令和./執行指令的不同

什麼是點指令?

首先,不要将點指令與點檔案或相對路徑表示法混淆。例如 .profile 表示該檔案(夾)是一個隐藏檔案(夾),您需要使用 ls -a 看到該檔案(夾)。另外點還可以表示相對路徑,比如,目前檔案夾中有一介名為“my-script.sh”的腳本,./my-script.sh 表示目前目錄下的my-script.sh腳本。../my-script.sh 表示上一層目錄的my-script.sh腳本。

Linux下source指令、點指令和./執行指令的不同

點指令,一種在目前shell下讀入路徑為filename的檔案并依次執行檔案中的所有語句的指令,即不會啟動一個新的子程序,所有在腳本中設定的變量将成為目前Shell的一部分。比如:當我們修改了/etc/profile檔案,并想讓它立刻生效,而不用重新登入,就可以使用點指令,如“. /etc/profile”,這麼一看是不是覺得有點眼熟,這不就是source指令嗎?

Linux下source指令、點指令和./執行指令的不同

source指令,從C Shell而來,是bash shell的内置指令。點指令,從Bourne Shell而來,是source的另一名稱。在bash環境下,兩者在使用上是等價的。

source filename(. filename) 與sh filename 及 ./filename執行腳本的差別

  1. 當shell腳本具有可執行權限時,用sh filename與./filename執行腳本是沒有差別得。./filename是因為目前目錄沒有在PATH中,點表示目前目錄。
  2. sh filename 重建立立一個子shell,在子shell中執行腳本裡面的語句,該子shell繼承父shell的環境變量,但子shell建立的、改變的變量不會被帶回父shell。
  3. source filename(. filename):這個指令其實隻是簡單地讀取腳本裡面的語句依次在目前shell裡面執行,沒有建立新的子shell。那麼腳本裡面所有建立、改變變量的語句都會儲存在目前shell裡面。

舉例

#!/usr/bin/env bash
export A="hello world"
echo $A           

在目前目錄下,我們有一個腳本my-script.sh腳本,内容如上。這時候,我們去執行./my-script.sh或 sh my-script.sh,會得到下面的結果。

$ ./test.sh 
hello world
$ echo $A           

也就是說,腳本執行了,但是腳本裡的環境變量并沒有影響目前shell。但是當我們執行. my-script.sh(注意中間有一個空格),或source my-script.sh。

$ . test.sh 
hello world
$ echo $A
hello world           

可以看到,A這個變量直接在目前shell下生效了,改變了目前環境的變量。

Linux下source指令、點指令和./執行指令的不同

小結

上面幾種指令都可以用來自動執行Shell腳本,進而實作自動化管理。它們可以用來啟動某些服務,安裝某些軟體,改變某些作業系統參數或完成其他操作,也可以用來檢查腳本的正确性,例如檢查腳本的文法和變量定義等。使用這些指令可以節省時間和節約資源,提高腳本的工作效率。

但是source指令和點指令會改變目前shell的狀态,是以在實際使用過程中,我們要能夠知道他們的相同與不同。

繼續閱讀