使用“.”和“source”运行脚本

Tim*_*Tim 29 shell bash shell-script

  1. 我想知道以下两种运行 bash 脚本的方式是否等效?

    . ./myScript.sh
    
    source myScript.sh
    
    Run Code Online (Sandbox Code Playgroud)
  2. 他们是否都在运行脚本的内容而不是运行脚本,即没有创建用于运行脚本的子shell?

jw0*_*013 24

  1. 它们在 bash 中是等价的,因为它们做完全相同的事情。另一方面,source长 5 个字符并且不能移植到仅 POSIX 的 shell 或 Bourne 而.(dot) 是,所以我从不费心使用source.

  2. 这是正确的 - 获取文件在当前 shell 中运行命令,它会影响您当前的 shell 环境。您仍然可以将参数传递给源文件,$PATH如果文件名不包含任何斜杠,那么bash 实际上会像普通命令一样查找文件名。


.vs的原始问题无关source,但在您的示例中,

. ./myScript.sh 
Run Code Online (Sandbox Code Playgroud)

不等同于

source myScript.sh
Run Code Online (Sandbox Code Playgroud)

因为 while.source在功能上是相同的,myScript.sh并且./myScript.sh不一样。由于./myScript.sh包含一个斜杠,它被解释为一个路径,shell 只使用./myScript.sh. 但是,myScript.sh没有斜线,所以外壳$PATH首先搜索它。这是POSIX 指定的标准行为.。大多数外壳默认为此,尽管它们可能会添加扩展名(例如在路径搜索后在当前工作目录中搜索)或更改./行为的选项source

  • 当提供的文件路径不包含 `/` 时的行为取决于 shell,而对于 `bash` 和 `zsh` 取决于是否启用了 POSIX 模式。还要注意,在许多 ksh 实现中,`.` 的行为与 `source` 不同。 (2认同)

Cal*_*leb 8

是的,它们是等价的。没有功能上的区别;.只是 的内置同义词source

(编辑:显然,这是唯一真正的bashzsh一些较轻的炮弹不具备的。source只有.通过POSIX指定所以kshdashash等可能没有source看到的。jw013的回答了信息。)