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