".filename"从/ bin/sh运行时找不到文件,从/ bin/bash开始工作; 为什么?

Nic*_*ick 7 linux bash shell sh

我的简单脚本是这样的:

#!/bin/sh


DEF=.file_name_with_a_leading_dot.sh

. ${DEF}
Run Code Online (Sandbox Code Playgroud)

注意顶行的/ bin/sh.当我运行这个简单的脚本时,我收到一个错误,找不到该文件.但是,如果我将该顶行更改为#!/ bin/bash,则脚本会在当前目录中找到该文件.

但是,在我的Ubuntu linux笔记本电脑上,我看到/ bin/sh是/ bin/bash的符号链接.那么,为什么我的脚本表现不同?

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

/bin/bash ./script.sh
Run Code Online (Sandbox Code Playgroud)

没关系.

那么,我错过了什么?

Man*_*rbe 7

Manpage:

.文件名[参数]

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

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

  • 这意味着:使用`../"$ DEF"`使其在POSIX模式下工作. (3认同)