“。 文件名“从/ bin / sh运行时找不到文件,从/ bin / bash运行; 为什么?

我的简单脚本是这样的:

#!/bin/sh DEF=.file_name_with_a_leading_dot.sh . ${DEF} 

注意顶部的/ bin / sh。 当我运行这个简单的脚本,我得到一个错误,找不到文件。 但是,如果我将该行改为#!/ bin / bash,那么脚本会在当前目录中find该文件。

但是,在我的Ubuntu Linux笔记本电脑上,我看到/ bin / sh是/ bin / bash的符号链接。 那么,为什么我的脚本有不同的performance呢?

另外,我可以像这样运行脚本:

 /bin/bash ./script.sh 

没关系。

那么,我错过了什么?

从手册页 :

文件名[参数]

源文件名[参数]在当前shell环境中从文件名读取和执行命令,并返回从文件名执行的最后一个命令的退出状态。 如果文件名不包含斜杠,则使用PATH中的文件名来查找包含文件名的目录。 在PATH中搜索的文件不需要是可执行的。 当bash不处于posix模式时,如果PATH中找不到文件,则搜索当前目录。 如果关闭shopt内建命令的sourcepath选项,则不会搜索PATH。 如果提供了任何参数,则在执行文件名时它们将成为位置参数。 否则,位置参数不变。 返回状态是脚本中最后一条命令的状态(如果没有执行命令,则为0),如果文件名未找到或无法读取,则返回false。

所以,shebang似乎#!/bin/sh将你的bash设置为posix模式。 在这种模式下,只评估PATH ,而不是当前目录。