当从/bin/sh运行时,“. filename”找不到文件,但在从/bin/bash运行时可以正常工作;为什么?

12

我的简单脚本如下:

#!/bin/sh


DEF=.file_name_with_a_leading_dot.sh

. ${DEF}

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

然而,在我的Ubuntu Linux笔记本电脑上,我看到/bin/sh是一个指向/bin/bash的符号链接。那么,为什么我的脚本表现不同呢?

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

/bin/bash ./script.sh

没问题。

那么,我错过了什么?


1
你可以在这里看一下:https://dev59.com/g2025IYBdhLWcg3w6aUX。基本上,`bash`和`sh`不是同一件事。 - ThanksForAllTheFish
2
当以/bin/sh调用时,Bash会启动为兼容模式。 - hek2mgl
但是这意味着它找不到文件吗?我可以重现这个问题。 - tripleee
sh模式似乎工作方式不同,但是./file能够正常工作。 - Andrew Porter
请记住,在编写问题标题时,StackOverflow的目标是建立一个知识库——我们可能有数百个关于bash和POSIX sh之间兼容性差异的问题,因此为了让人们在搜索该知识库时能够找到并区分问题,它需要具有反映其所询问的特定差异的标题。我已经尝试进行了编辑。 - Charles Duffy
1个回答

10

来自Manpage:

. 文件名 [参数]

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

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


3
意思是:使用. ./"$DEF"以在POSIX模式下使其正常工作。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接