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

如何实现目录树可执行文件的Bash自动补全(结合fzf)

覆盖Bash中./的默认补全,实现可执行文件交互式选择(结合fzf)

问题核心

complete -F __compl_foo './'无法生效的原因是:Bash不将./识别为独立命令,而是把它当作路径前缀的一部分,默认调用文件补全逻辑,因此无法直接通过complete命令针对./注册补全函数。

解决方案:重写路径补全函数

通过修改Bash默认的文件补全函数_filedir,实现对./开头输入的特殊处理,结合fzf完成交互式选择:

  1. 备份并重写_filedir函数
# 备份原始的文件补全函数
_filedir_orig=$(declare -f _filedir)

# 重写_filedir,优先处理./开头的可执行文件补全
_filedir() {
    # 仅处理以./开头的补全请求
    if [[ "${COMP_WORDS[COMP_CWORD]}" == ./* ]]; then
        # 查找当前目录及子目录下的可执行文件(排除隐藏文件/目录)
        # 若需包含Windows可执行文件(.exe),可添加 `-o -name "*.exe"` 到find条件中
        local execs
        execs=$(find . -type f -executable ! -name ".*" | grep -v '/\.' | sort)
        
        # 用fzf交互式选择
        local selected
        selected=$(echo "$execs" | fzf --height=40% --reverse --prompt="选择可执行文件: ")
        
        # 设置补全结果
        if [[ -n "$selected" ]]; then
            COMPREPLY=("$selected")
            return 0
        fi
    fi
    # 非./开头的输入,调用原始补全逻辑
    $_filedir_orig "$@"
}
  1. 生效配置
    将上述代码添加到~/.bashrc或~/.bash_profile中,执行source ~/.bashrc即可生效。

优化建议

  • 限制查找深度:在find命令中添加-maxdepth N(N为数字),避免遍历过深的目录
  • 无fzf fallback:如果未安装fzf,可替换为直接输出可执行文件列表作为补全选项:
    COMPREPLY=($(compgen -W "$execs" -- "${COMP_WORDS[COMP_CWORD]}"))
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:03:26