'.' 和有什么不一样?和贝壳中的“来源”?

'.' 和有什么不一样?和贝壳中的“来源”?

可能的重复:
运行带有“. ”和“来源”

我已经使用了点命令“.”和 '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 行为。


1zshbash在调用时启用 POSIX 模式sh。对于bash,当它POSIXLY_CORRECT在其环境中接收时(即使​​作为 bash 调用,即使没有调用 POSIX 命令bash),或者当它接收时SHELLOPTS=posix,或者用bash --posixbash -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 的许多控制变量都有长版本和短版本。

相关内容