天天看點

關于Shell的source、點(.)和export

 整理自網絡多個來源。

1、source與點指令,功能相同,來源不同。

<code>source 指令是 bash shell 的内置指令,從 C Shell 而來。</code>

<code>source 指令的另一種寫法是點符号,用法和 source 相同,從Bourne Shell而來。</code>

2、shell腳本執行方法

  有兩種方法執行shell scripts,一種是新産生一個shell,然後執行相應的shell scripts;一種是在目前shell下執行,不再啟用其他shell。

  新産生一個shell然後再執行scripts的方法是在scripts檔案開頭加入語句:#!/bin/sh。一般的script檔案(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子程序),然後在其下執行指令。

  另外一種方法就是上面說過的source指令,不再産生新的shell,而在目前shell下執行一切指令。在 bash下輸入man source,找到source指令解釋處,可以看到解釋"Read and execute commands from filename in the current shell environment and ..."。從中可以知道,source指令是在目前程序中執行參數檔案中的各個指令,而不是另起子程序(或sub-shell)。

3、關于source指令。

<code>source 指令可以強行讓一個腳本去立即影響目前的環境。</code>

<code>source 指令會強制執行腳本中的全部指令,而忽略檔案的權限。</code>

<code>source 指令通常用于重新執行剛修改的初始化檔案,如 .bash_profile 和 .profile 等等。</code>

4、關于export指令。

  export和source其實是兩個完全不同的指令。export一般解釋是“設定或顯示環境變量”。這在功能上說沒錯,但是為什麼要用“導出”這個單詞呢?

  這是因為在子 shell(參見第2點)中定義的變量隻在該子shell内有效。如果在一個shell腳本程式中定義了一個變量,當該腳本程式運作時,這個定義的變量隻是該腳本程式内的一個局部變量,其他的shell不能引用它,要使某個變量的值可以在其他shell中被改變,可以使用export指令對已定義的變量進行輸出。 export指令将使系統在建立每一個新的shell時定義這個變量的一個拷貝。這個過程稱之為變量輸出。

5、source filename 與 sh filename 及./filename執行腳本的差別。

(1)、當shell腳本具有可執行權限時,用sh filename與./filename執行腳本是沒有差別的。 ./filename是因為目前目錄沒有在PATH中,所有"."是用來表示目前目錄的。

(2)、sh filename 重建立立一個子shell,在子shell中執行腳本裡面的語句,該子shell繼承父shell的環境變量,但子shell建立的、改變的變量不會被帶回父shell,除非使用export。

(3)、source filename:這個指令其實隻是簡單地讀取腳本裡面的語句依次在目前shell裡面執行,沒有建立新的子shell。那麼腳本裡面所有建立、改變變量的語句都會儲存在目前shell裡面。

*** walker ***

本文轉自walker snapshot部落格51CTO部落格,原文連結http://blog.51cto.com/walkerqt/1690202如需轉載請自行聯系原作者

RQSLT