用“.”可以吗?在 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 && . $_

相关内容