我想知道以下两种运行 bash 脚本的方法是否等效?
. ./myScript.sh source myScript.sh
- 它们是否都运行脚本的内容而不是运行脚本,即不创建用于运行脚本的子shell?
答案1
它们在 bash 中是等效的,因为它们执行完全相同的操作。另一方面,
source
它长了 5 个字符,并且不能移植到仅 POSIX shell 或 Bourne,而.
(dot) 可以,所以我从不费心使用source
.这是正确的 - 获取文件会在当前 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
。
(编辑:显然这仅适用于bash
和zsh
。一些较轻的 shell 没有source
,仅.
由 POSIX 指定,因此ksh
、dash
、ash
等可能没有source
。参见jw013 的回答供参考。)