[英]". filename" can't find file when run from /bin/sh, works from /bin/bash; why?
我的简单脚本是这样的:
#!/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
没关系。
那么,我错过了什么?
从手册页:
. 文件名 [参数]
source filename [arguments]在当前 shell 环境中从 filename 读取并执行命令,并返回从 filename 执行的最后一个命令的退出状态。 如果文件名不包含斜杠,则使用 PATH 中的文件名来查找包含文件名的目录。 在 PATH 中搜索的文件不必是可执行文件。 当 bash 不处于 posix 模式时,如果在 PATH 中没有找到文件,则搜索当前目录。 如果 shopt 内置命令的 sourcepath 选项关闭,则不会搜索 PATH。 如果提供了任何参数,它们将在执行 filename 时成为位置参数。 否则位置参数不变。 返回状态是脚本中退出的最后一个命令的状态(如果没有执行任何命令,则返回 0),如果找不到文件名或无法读取文件名,则返回 false。
因此,shebang #!/bin/sh
似乎将您的 bash 设置为 posix 模式。 在这种模式下,只评估PATH
,而不是当前目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.