‘.’ 和有什麼區別?和貝殼中的“來源”?
可能重複:
我已經使用了兩個點命令’。和 ‘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 ksh
source
也不會退出 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
腳本中(sh
POSIX在哪裡sh
),您應該能夠依賴上述 POSIX 行為。¹
zsh
並bash
在呼叫時啟用 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。