调用shell脚本时sh和./有什么区别?

sha*_*ant 3 command-line shell shell-script

我看到人们通过键入./scriptname. 现在这似乎是默认方式,因为我经常看到它,但偶尔但并不罕见,我看到它们键入sh scriptname. 这只是偏好问题还是./sh之间有更显着的区别?

Ste*_*itt 11

有一些区别。

./scriptname
Run Code Online (Sandbox Code Playgroud)

要求被调用的文件scriptname是可执行的,并且它使用指定的外壳作为其第一行(在“shebang”中,例如 #!/bin/sh),如果有的话。

sh scriptname
Run Code Online (Sandbox Code Playgroud)

只要被调用的文件scriptname是可读的,它就可以工作,并且sh无论脚本的shebang指定什么,它都会使用(无论是什么)。对于某些 shell,如果scriptname当前目录中不存在,PATH则将搜索 中指定的目录,并scriptname改为读取和解释在那里找到的第一个目录(如果有)。

换一种方式,

sh scriptname
Run Code Online (Sandbox Code Playgroud)

无需设置即可工作,但您可能使用了错误的 shell,并且您可能运行了错误的脚本。

./scriptname
Run Code Online (Sandbox Code Playgroud)

将尝试使用正确的 shell(或者至少是脚本作者指定的 shell,如果有的话)运行正确的脚本,但它可能需要先进行一些设置 ( chmod a+x scriptname)。