可能的重复:
运行带有“. ”和“来源”
我已经使用了点命令“.”和 'source' 来重新加载给定的 rc 文件(通常是为了更新我的环境变量),但我不确定它们是否不同以及是否是首选。两者有什么区别 ?
答案1
.
是 Bourne 和 POSIX shell 命令,而source
是 C-Shell 命令。
一些 Bourne-shell 衍生品bash
,如zsh
和 的大多数实现ksh
也有一个source
命令,该命令通常是 的别名.
- 但是,它的行为可能略有不同(例如在 zsh 和 ksh 中)。
对于 bash,.
和source
行为相同,但它们的行为受到是否在 POSIX 模式下运行的影响。
POSIX 要求该.
命令如果无法打开文件进行读取,则退出 shell 进程²;$PATH
如果提供的路径不包含/
.
csh
'ssource
将参数解释为路径,并且从不在 中查找文件$PATH
。
bash.
并source
在 POSIX 模式下按 POSIX 要求行事,在source
非 POSIX 模式下则按 pdksh 要求行事,也就是说,如果无法打开文件进行读取(与 相同command .
)并在中查找文件,则它们不会退出脚本$PATH
和当前目录如果提供的路径不包含/
.
zsh 的.
行为符合 POSIX 要求,同时source
在当前目录中查找第一的然后$PATH
(即使在csh
仿真中)当参数不包含/
. (看info zsh .
和info zsh source
了解详情)。如果.
或source
未能找到/打开文件,则只会在 POSIX 模式(sh
模拟)下中止 shell。
AT&T kshsource
也不退出 shell,但不在当前目录中查找文件。
总而言之,在类似 Bourne 的 shell 中(尽管不是没有内置的 Bourne shell command
),如果你想要一致的行为,你可以这样做
command . /path/to/the-file-to-source || handle-error
而如果文件到源应该在当前目录中,请务必写入:
command . ./the-file-to-source || handle-error
在sh
脚本中(其中sh
是 POSIX sh
),您应该能够依赖上面所述的 POSIX 行为。
1zsh
并bash
在调用时启用 POSIX 模式sh
。对于bash
,当它POSIXLY_CORRECT
在其环境中接收时(即使作为 bash 调用,即使没有调用 POSIX 命令bash
),或者当它接收时SHELLOPTS=posix
,或者用bash --posix
或bash -o posix
或之后调用时set -o posix
。使用 zsh,您可以emulate sh
使用仿真 sh
。模拟改变了一大堆改变 zsh 行为的选项。在这种情况下,选项是POSIX_BUILTINS
。
在 bash 中,您可以使用(非 POSIX)命令检查是否处于 POSIX 模式[ -o posix ]
。在 zsh 中,您可以检查 的输出emulate
来查看您是否处于sh
模拟状态,或者[[ -o posixbuiltins ]]
检查是否启用了该特定选项。您还可以暂时启用给定的仿真模式emulate -L
(以在当前当地的仅限范围)。
² 适用于非交互式 shell。对于交互式 shell,不同 shell 的行为有所不同,有些会忽略失败,有些会像某些语法错误一样返回提示符。此外,当在子 shell 中运行时,仅退出子 shell。
答案2
source
存在是为了可读性和自我文档化,.
存在是因为它可以快速打字。命令是相同的。出于同样的原因,Perl 的许多控制变量都有长版本和短版本。