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

使用“.”和“source”运行脚本
  1. 我想知道以下两种运行 bash 脚本的方法是否等效?

    . ./myScript.sh
    
    source myScript.sh
    
  2. 它们是否都运行脚本的内容而不是运行脚本,即不创建用于运行脚本的子shell?

答案1

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

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


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

. ./myScript.sh 

不等于

source myScript.sh

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

答案2

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

(编辑:显然这仅适用于bashzsh。一些较轻的 shell 没有source,仅.由 POSIX 指定,因此kshdashash等可能没有source。参见jw013 的回答供参考。)

相关内容