Shell

‘.’ 和有什麼區別?和貝殼中的“來源”?

  • May 15, 2021

可能重複:

使用“. ” 並帶有“來源”

我已經使用了兩個點命令’。和 ‘source’ 重新載入給定的 rc 文件(通常用於更新我的環境變數),但我不確定它們是否不同以及是否首選。兩者有什麼區別 ?

.是 Bourne 和 POSIX shell 命令,而source是 C-Shell 命令。

一些 Bourne-shell 衍生工具,如bash,zsh和大多數實現ksh也有一個source命令,該命令通常是別名.- 但是,它的行為可能略有不同(例如在 zsh 和 ksh 中)。

對於 bash,.行為source相同,但它們的行為受它們是否在 POSIX 模式下執行的影響¹。

POSIX 要求該.命令在無法打開文件進行讀取時退出 shell 程序²,並且$PATH如果提供的路徑不包含/.

csh’ssource將參數解釋為路徑,並且永遠不會在$PATH.

bash.source在 POSIX 模式下按 POSIX 要求執行,在沒有時按 pdksh 執行,也就是說,如果它們無法打開文件進行讀取(與 相同)並在目前目錄中查找文件source,則它們不會退出腳本,如果提供的路徑不包含.command .``$PATH /

zsh的.行為符合 POSIX 的要求,當參數不包含. (詳見和)。如果或未能找到/打開文件,則只會在處於 POSIX 模式(仿真)時中止 shell。source``$PATH``csh``/info zsh .info zsh source.``source``sh

AT&T kshsource也不會退出 shell,但不會在目前目錄中查找文件。

總而言之,在類似 Bourne 的 shell(儘管不是沒有command內置函式的 Bourne shell)中,如果你想要一致的行為,你可以這樣做

command . /path/to/the-file-to-source || handle-error

如果*-file-to-source*應該在目前目錄中,請務必編寫:

command . ./the-file-to-source || handle-error

sh腳本中(shPOSIX在哪裡sh),您應該能夠依賴上述 POSIX 行為。


¹zshbash在呼叫時啟用 POSIX 模式sh。對於bash, 當它POSIXLY_CORRECT在其環境中接收時(即使呼叫為 bash 即使沒有呼叫 POSIX 命令bash),或者當它接收時,或者當使用or或之後SHELLOPTS=posix呼叫時。使用 zsh,您可以模擬. 仿真改變了一大堆改變 zsh 行為的選項。在這種情況下,選項是。bash --posix``bash -o posix``set -o posix``emulate sh sh``POSIX_BUILTINS

[ -o posix ]在 bash 中,您可以使用 (non-POSIX),命令檢查是否處於 POSIX 模式。在 zsh 中,您檢查 的輸出emulate以查看您是否處於sh仿真狀態,或者[[ -o posixbuiltins ]]檢查是否啟用了該特定選項。您還可以臨時啟用給定的仿真模式emulate -L(僅在目前本地範圍內進行仿真)。

² 用於非互動式外殼。對於互動式 shell,shell 之間的行為會有所不同,有些會忽略失敗,有些會像某些語法錯誤一樣返回提示。此外,當在子shell 中執行時,它只退出子shell。

引用自:https://unix.stackexchange.com/questions/58514