You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录。

测试过程

  1. PATH目录下文件存在时
    从/root目录调用主脚本,结果优先加载PATH目录下的脚本:
# pwd
/root
# dir/main.sh 
in PATH dir
  1. 移除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
  1. 移除调用目录下的文件后
    此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:08:11