是否可以使用“。” 在Ubuntu和OS X中的.bashrc中运行文件而不是源文件?


11

好的,因此source可以分别在当前外壳中运行该脚本.,例如,在运行脚本中使用“。”和“ 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上使用(因此它们实际上与sourceand都可以使用.,也就是说,它们在外壳程序中为我提供了所需的功能)。我应该选择一个,还是错过了什么?

FWIW,在OS X上,我.bashrc从中获取我的资源.bash_profile


1
如果是基于“ sh”的shell,我将使用“。”。为了实现全局兼容性,如果您使用的是基于'csh'的shell,我将使用source。
mdpc

2
您在链接中的哪个位置看到“ 分别source在当前shell中运行脚本.”?他们都在当前的shell中运行它。否则就没有意义了
Michael Mrozek

Answers:


11

这是POSIX的定义.dot

外壳程序应在当前环境中执行来自文件的命令。

如果file不包含/<slash>,则外壳程序应使用指定的搜索路径$PATH来查找包含文件的目录。不同于一般的命令搜索,但搜索的文件由.dot 程序需要执行的。如果找不到可读文件,则非交互式外壳应中止;交互式外壳应向标准错误写入诊断消息,但这种情况不应视为语法错误。

考虑到上述情况,您最好将[ -f ./file ] && source ./file. ./file全部替换为。如果文件不存在,最糟糕的情况是登录时会收到通知-我想这可能是您想要的信息。

当然,如果您希望保留测试,可以这样做:

test -f ./file && . $_

2
哦,人们都知道$_,我喜欢。:)
Andreas Wiese 2014年

@AndreasWiese-每个人都应该-它是POSIX定义的仅7个特殊参数之一。
mikeserv

1,我结束了使用test -f /.file && . $_此处显示的方法
迈克尔·达兰特

6
@mikeserv不,$_不是POSIX标准化的。在8组特殊的参数$@$*$#$$$!$?$-$0$_明确省略。您的不正确评论引发了一个问题
吉尔斯(Gilles)'所以

19

bash.并且source是同义词。查看bash源代码file 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不限制外壳,因此您上面的所有脚本都可以使用。

就个人而言,我始终使用.代替source。(我编写的许多脚本都在cron)下运行。


万物均等,请使用“源”而不是“”。出于一个原因:尝试搜索/ grep“”。大型脚本中的表达式。这是一场噩梦。
abonet 2014年

尽管这个答案解释了为什么使用@ .通常比使用更好source,正如@abonet所说,source搜索起来要容易得多。由于句点在许多语言中都是标点符号,因此很容易跳过它们。这就是为什么我更喜欢使用source
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.