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

Iva*_*var 19 shell environment-variables bashrc

可能的重复:
使用“. ”和“来源”

我已经使用了点命令 '.' 和 'source' 重新加载给定的 rc 文件(通常用于更新我的环境变量),但我不确定它们是否不同以及是否首选。两者有什么区别 ?

Sté*_*las 32

.是 Bourne 和 POSIX shell 命令,而source是 C-Shell 命令。

一些 Bourne-shell 派生类bash,如zsh和 的大多数实现ksh也有一个source命令,它通常是 for 的别名.- 但是,它的行为可能略有不同(例如在 zsh 和 ksh 中)。

对于bash,.source相同的行为,但他们的行为是由他们是否在POSIX模式下运行或not¹影响。

POSIX 要求.命令在无法打开文件进行读取时退出 shell 进程²,$PATH如果提供的路径不包含/.

csh'ssource将参数解释为路径,并且永远不会在$PATH.

庆典.source表现为POSIX要求在POSIX模式下,并作为pdksh程序的source时候没有,那就是如果他们不能打开文件进行读取(相同的,因为他们不退出脚本command .)和查找的文件$PATH 和当前目录,如果提供的路径不包含/.

zsh的.是POSIX要求,同时的行为source看起来在当前目录第一,然后$PATH(甚至在csh仿真)当参数不包含/。(请参阅info zsh .info zsh source了解详情)。如果.source无法找到/打开文件,则只会在 POSIX 模式(sh仿真)下中止 shell 。

AT&T kshsource也不会退出 shell,但不会在当前目录中查找文件。

总而言之,在类似 Bourne 的 shell(虽然不是没有command内置的 Bourne shell )中,如果你想要一致的行为,你可以这样做

command . /path/to/the-file-to-source || handle-error
Run Code Online (Sandbox Code Playgroud)

如果the-file-to-source是在当前目录中,一定要写:

command . ./the-file-to-source || handle-error
Run Code Online (Sandbox Code Playgroud)

sh脚本(哪里sh是 POSIX sh)中,您应该能够依赖上述 POSIX 行为。


¹zshbash在调用时启用 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 中,您可以使用 (non-POSIX),[ -o posix ]命令检查是否处于 POSIX 模式。在 zsh 中,您检查 的输出emulate以查看您是否处于sh仿真状态,或[[ -o posixbuiltins ]]检查是否启用了该特定选项。您还可以临时启用给定的仿真模式emulate -L(仅在当前本地范围内进行仿真)。

² 用于非交互式 shell。对于交互式外壳,行为因外壳而异,有些会忽略失败,有些会像某些语法错误一样返回提示。此外,当在子 shell 中运行时,它只会退出子 shell。