使用“。”运行脚本 ”和“来源”


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

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

1
嘿,在手册页中!
亚历克斯

@alex:请给我看看?man .man source或者我还不知道的任何东西。
蒂姆(Tim)

2
type .help .
rozcietrzewiacz

man $SHELL/source
alex

4
根据其他人更便携
l0b0

Answers:


21
  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由于没有斜杠,因此外壳$PATH程序首先对其进行搜索。这是POSIX指定的标准行为.。尽管大多数shell可能会添加扩展名(例如,在路径搜索之后在当前工作目录中进行搜索)或更改./ 行为的选项,但大多数默认情况下都使用此扩展名source


2
文件的提供的路径不包含时的行为取决于/外壳,并且针对bash并且zsh取决于是否启用POSIX模式。还要注意,在许多ksh实现中,.其行为与有所不同source
斯特凡Chazelas

@StephaneChazelas是的,你是对的。我添加了一条说明,以澄清上面的描述是POSIX标准的。
jw013

8

是的,它们是等效的。没有功能上的差异;.只是的内置同义词source

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


谢谢!但是$ alias .输出bash: alias: .: not found
蒂姆

那就是它们都是内置的,别名也是内置的。这是有据可查的,但是我想在这种情况下,“同义词”是正确的术语,而不是“别名”。
Caleb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.