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
相关产品推荐
相关产品推荐

