我有一个shell脚本基本上可以这样做:


 #!/ bin / bash
 PREV =`pwd`&#xA ; cd $ 1
 source another.sh
 cd $ PREV



 这曾经与bash 3.2.5一起使用,但是停止使用bash 4.1.2。


 ./ this.sh< dir>
 /home/this.sh:line 4:source:another.sh:找不到文件& #xA;


 如果我将 source another.sh 更改为 source ./another.sh ,我认为无论如何都会是一种更好的做法。但我很好奇新的bash版本发生了什么变化。


非常感谢!

答案 0 :(得分:2)
这是3.2版本和4.0-alpha之间的变化,在更改日志中标注为
ggg. Fixed a bug that caused a shell running in Posix mode to search $PWD for a file specified as an argument to source/. when the file was not found in $PATH.
......还有previously discussed on the mailing list。
请注意,source
的bash 3.2文档指定了其行为,如下所示:
source:source filename [arguments]
从FILENAME读取并执行命令并返回。路径名 在$ PATH中用于查找包含FILENAME的目录。如果有的话 提供ARGUMENTS,它们成为时间位置参数 执行FILENAME。
这相当清楚地指明PATH将用于查找要运行的文件(如果不是绝对的),并且没有迹象表明应该引用当前工作目录;因此,它的行为超出了规范;因此,删除它没有打破任何记录的行为。
最后,from the POSIX specification for the .
command:
如果file不包含斜杠,shell应使用PATH指定的搜索路径来查找包含文件的目录。但是,与普通命令搜索不同,dot实用程序搜索的文件不需要是可执行的。如果未找到可读文件,则非交互式shell将中止;交互式shell应将诊断消息写入标准错误,但不应将此条件视为语法错误。
因此,新行为符合POSIX标准。
答案 1 :(得分:0)
这实际上是正确的行为。来自sh
的POSIX规范:
“dot - 在当前环境中执行命令”
“如果文件不包含斜杠,shell应使用PATH指定的搜索路径来查找包含文件的目录。”
“一些较旧的实现在当前目录中搜索了该文件,即使PATH的值不允许它。由于担心引入对特洛伊木马的敏感性,这一行为在IEEE Std 1003.1-2001的卷中被省略了...... “