gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:29:38 25 4
gpt4 key购买 nike

我有一个 shell 脚本,基本上做这样的事情:

#!/bin/bash
PREV=`pwd`
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: file not found

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

非常感谢!

最佳答案

这是 3.2-release 和 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]

Read and execute commands from FILENAME and return. The pathnames in $PATH are used to find the directory containing FILENAME. If any ARGUMENTS are supplied, they become the positional parameters when FILENAME is executed.

这相当清楚地指定了 PATH 将用于查找要运行的文件(如果不是绝对的),但没有指示应引用当前工作目录;因此,它的行为超出了规范;因此,删除它不会破坏任何记录在案的行为。


最后,from the POSIX specification for the . command :

If file does not contain a slash, the shell shall use the search path specified by PATH to find the directory containing file. Unlike normal command search, however, the file searched for by the dot utility need not be executable. If no readable file is found, a non-interactive shell shall abort; an interactive shell shall write a diagnostic message to standard error, but this condition shall not be considered a syntax error.

因此,新行为完全符合 POSIX 标准。

关于linux - Bash - source &lt;script&gt; 停止使用 bash 4.1.2 在当前目录中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32956483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com