【问题标题】:". filename" can't find file when run from /bin/sh, works from /bin/bash; why?".filename" 从 /bin/sh 运行时找不到文件,从 /bin/bash 运行;为什么?
【发布时间】:2015-12-23 01:13:07
【问题描述】:

我的简单脚本是这样的:

#!/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

没关系。

那么,我错过了什么?

【问题讨论】:

  • 您可以在这里查看:stackoverflow.com/questions/5725296/…。基本上,bashsh 不是一回事
  • 当被称为/bin/sh时,Bash 以兼容模式启动
  • 但是为什么这意味着它找不到文件?我可以重现这个。
  • sh 模式的工作方式似乎有所不同。/.file 工作......
  • 请记住,在编写问题标题时,StackOverflow 的目标是建立一个知识库——我们可能有 数百 个关于 bash 和POSIX sh,因此对于人们在该知识库中搜索时可以实际找到和区分的问题,它需要有一个反映它所询问的 特定 差异的标题。我已尝试进行相应的编辑。

标签: linux bash shell sh


【解决方案1】:

来自Manpage

。文件名 [参数]

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

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

【讨论】:

  • 这意味着:使用. ./"$DEF"使其在POSIX模式下工作。
猜你喜欢
  • 2019-10-08
  • 2017-07-31
  • 2013-01-29
  • 2020-10-04
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 2021-01-25
相关资源
最近更新 更多