BASH中source命令的路径优先级及权威文档问询
关于BASH中source命令的路径查找优先级问题
疑问与测试结果
我想找BASH中source命令查找脚本路径的官方文档,自己测试后发现:PATH变量中列出的目录优先级高于调用目录,这和某第三方文章的描述矛盾。
测试环境
我设置了1个主脚本和3个不同位置的同名脚本:
/root/dir/main.sh
#!/bin/bash source script.sh
/root/dir/script.sh
#!/bin/bash printf 'same dir as script.sh\n'
/root/script.sh
#!/bin/bash printf 'same dir of invoke\n'
/root/bin/script.sh
#!/bin/bash printf 'in PATH dir\n'
我的$PATH环境变量包含/root/bin目录。
测试过程
- PATH目录下文件存在时
从/root目录调用主脚本,结果优先加载PATH目录下的脚本:
# pwd /root # dir/main.sh in PATH dir
- 移除PATH目录下的文件后
此时source会加载调用目录(/root)下的脚本:
# mv -vi /root/bin/script.sh{,.bak} renamed '/root/bin/script.sh' -> '/root/bin/script.sh.bak' # pwd /root # dir/main.sh same dir of invoke
- 移除调用目录下的文件后
此时source无法找到文件,且不会自动去主脚本(main.sh)所在的/root/dir目录查找:
# mv -vi /root/script.sh{,.bak} renamed '/root/script.sh' -> '/root/script.sh.bak' # pwd /root # dir/main.sh dir/main.sh: line 2: script.sh: No such file or directory # ls dir main.sh script.sh
与第三方文章的矛盾
某文章中的描述与测试结果相反:
当在Bash中使用source时,它会先在当前目录查找指定文件(这不是所有shell的默认行为,非Bash环境请查阅对应文档)。
如果Bash找不到该文件,才会去PATH中搜索。同样,这也不是所有shell的默认行为,非Bash环境请查阅对应文档。
官方文档说明
Bash官方手册(bash(1))中对source(等价于.命令)的路径查找规则有明确说明:
当执行source filename或. filename时,如果filename不包含斜杠(/),Bash会优先在PATH环境变量的目录中查找该文件;如果在PATH中找不到,才会去当前工作目录查找。
这与我的测试结果完全一致,第三方文章的描述存在错误。你可以通过执行man bash并搜索source或.命令的章节,查看完整的官方规则。
内容的提问来源于stack exchange,提问作者midnite
相关产品推荐
相关产品推荐

