Bash - source <script>停止使用bash 4.1.2在当前目录中搜索

时间:2015-10-05 19:34:07

标签: linux bash shell

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

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

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

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

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

&#xA;&#xA;

非常感谢!

&#xA;

2 个答案:

答案 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的卷中被省略了...... “