用「.」可以嗎?在 Ubuntu 和 OS X 中執行檔案而不是 .bashrc 中的原始碼?

用「.」可以嗎?在 Ubuntu 和 OS X 中執行檔案而不是 .bashrc 中的原始碼?

好的,所以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 && . $_

相關內容