好的,所以source
在當前 shell 中單獨運行腳本.
,詳細資訊請參見使用“.”和“source”運行腳本例如,但是,具體來說,在我的.bashrc
文件,我有:
[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh
我可以將其替換為:
[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh
這能在 OS X 上運作嗎——這是「POSIX」問題嗎?
我嘗試了一下,上面的內容似乎仍然可以在 Ubuntu 上運行(所以它們實際上可以與 和 一起使用source
,.
也就是說,它們在 shell 中為我提供了所需的功能)。我應該選擇其中之一,還是我錯過了什麼?
FWIW,在 OS X 上,我.bashrc
從我的.bash_profile
.
答案1
在bash
、.
和source
是同義詞。查看bash
原始程式碼文件builtin/source.def
,您可以看到.
並source
使用相同的內部函數source_builtin
:
$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$END
$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.
但source
不相容於 POSIX,因此如果您的腳本是使用 POSIX 調用的/bin/sh
,您應該使用.
而不是source
.由於 POSIX 不限制 shell,所以上面的所有腳本都可以工作。
就我個人而言,我總是使用.
而不是source
. (我編寫的許多腳本都在 下運行cron
)。
答案2
這是POSIX 的定義的.dot
:
shell 應在目前環境中執行檔案中的命令。
如果 file 不包含
/<slash>
,shell 將使用 指定的搜尋路徑來$PATH
尋找包含檔案的目錄。然而,與普通命令搜尋不同的是,實用程式搜尋的檔案.dot
需要不是是可執行的。如果沒有找到可讀文件,非互動式 shell 將中止;互動式 shell 應將診斷訊息寫入標準錯誤,但這種情況不應被視為語法錯誤。
考慮到上述情況,您不妨將您完全替換[ -f ./file ] && source ./file
為. ./file
。如果該文件不存在,最糟糕的情況是您會在登入時收到通知 - 我認為這可能是您想要的資訊。
當然,如果您想保留測試,您可以這樣做:
test -f ./file && . $_