如何让find命令正常识别bashrc中导出的bash函数
问题原因
export -f是Bash独有的函数导出语法,导出的函数仅能被子Bash进程识别。你在find的-exec参数中调用的是sh,绝大多数Linux发行版里sh指向Dash、Ash等轻量POSIX兼容Shell,这类Shell不识别Bash导出的函数格式,因此会抛出foo: not found错误。
可行解决方案
方案1:替换-exec调用的Shell为Bash
把-exec里启动的sh换成bash即可,子Bash进程会自动继承当前会话通过export -f导出的函数:
find . -exec bash -c 'cd "$1"; foo' bash {} \;
说明:
bash -c后的第一个参数bash用于给子Shell的$0变量赋值,不可省略。
方案2:直接在当前Bash会话遍历路径执行
如果不想嵌套子Shell,也可以直接遍历find输出的路径调用函数,这种方式无需依赖函数导出,当前Shell定义的foo可以直接被调用:
find . -print0 | while IFS= read -r -d '' target_path; do # 用括号包裹命令,在独立子Shell中切换目录,避免修改当前会话的工作路径 (cd "$target_path" && foo) done
说明:
-print0和read -d ''的组合用于兼容带空格、换行符等特殊字符的文件名,避免路径解析出错。
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

