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

source与.在find -exec中表现差异的原因及其他不同点

为什么find -exec中.和source表现不同?

核心原因:find -exec的执行机制

find的-exec参数会直接调用系统execve()接口执行指定命令,不会通过Shell解析。而.和source都是Bash的内建命令——它们不是独立可执行文件,只能在Bash进程内部运行:

  • 执行find ... -exec . {} \;时,find会把.当作可执行文件路径(.代表当前工作目录),尝试执行目录,但目录没有执行权限,因此报错Permission denied。
  • 执行find ... -exec source {} \;时,find会在系统PATH中寻找名为source的可执行文件,但该文件不存在(source是Bash内建命令),因此报错No such file or directory。

要正确在find -exec中执行这两个命令,需显式调用Bash处理:

# 使用 . 命令
find ~/tmp -type f -iname "test.sh" -exec bash -c '. "$0"' {} \;

# 使用 source 命令
find ~/tmp -type f -iname "test.sh" -exec bash -c 'source "$0"' {} \;

.和source的其他差异

虽然多数场景下二者功能一致(读取并执行脚本,且在当前Shell环境生效),但存在以下细微区别:

  • POSIX兼容性:.是POSIX标准规定的内建命令,所有符合POSIX的Shell(如dash、ksh)都支持;而source是Bash特有的命令,在非Bash环境中可能不存在。
  • 选项支持:Bash的source命令支持额外选项:
    • -n:仅对脚本做语法检查,不执行
    • -v:先打印脚本内容,再执行
    • -x:开启调试模式,打印每条执行的命令
      而.命令不支持任何选项,若尝试传递选项(如. -v test.sh),会把选项当作脚本文件名处理,导致报错。

内容的提问来源于stack exchange,提问作者Uberhumus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:26:13