bash - 如何在 bash 中启用默认文件完成

标签 bash

假设我有一个名为“foo”的命令,它接受一个参数(“加密”或“解密”),然后是一个文件列表。我想编写一个 bash 完成脚本来帮助处理第一个参数,然后为其他参数启用标准文件完成。我能得出的最接近的结果是:

complete -F _foo foo

function _foo()
{
    local cmds cur
    if [ $COMP_CWORD -eq 1 ]
    then
        cur="${COMP_WORDS[1]}"
        cmds=("encrypt decrypt")
        COMPREPLY=($(compgen -W "${cmds}" -- ${cur}) )
    else
        COMPREPLY=($(compgen -f ${COMP_WORDS[${COMP_CWORD}]} ) )
    fi
}

这会正确执行第一个参数,并会从当前目录中为后续参数选择一个文件名。但是假设当前目录包含一个包含文件 baz.txt 的子目录 bar。键入 ba-TAB-TAB 后,完成结果为“bar”(“r”后的空格)并准备好选择下一个参数。我想要的是标准的 bash 完成,结果是“bar/”(斜杠后没有空格),准备在子目录中选择一个文件。有什么办法可以得到吗?

最佳答案

我知道这有点晚了,但我在这里找到了解决方案:https://stackoverflow.com/a/19062943/108105

基本上,您使用 complete -o bashdefault -o default,当您想恢复为默认的 bash 完成时,您可以设置 COMPREPLY=()。这是一个例子:

complete -o bashdefault -o default -F _foo foo
_foo() {
    local cur=${COMP_WORDS[COMP_CWORD]}
    if (( $COMP_CWORD == 1 )); then
        COMPREPLY=( $(compgen -W 'encrypt decrypt' -- "$cur") )
    else
        COMPREPLY=()
    fi
}

关于bash - 如何在 bash 中启用默认文件完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513571/

相关文章:

mysql - 运行 bash 脚本一并停止

linux - 如何使用 Shell 脚本从 Linux 中的 Excel 工作表中读取数据?

linux - bash/Makefile 中的双美元符号是什么意思?

linux - if else in ssh pseudo-tty 分配给远程服务器怎么办

linux - 管链中的函数

linux - 如何在没有密码的情况下执行bash脚本?

bash - 在命令行上解析 shell 脚本的输入

Linux 子系统 ssh 看不到 id_rsa.pub

使用 virtualbox 删除和创建快照的 Bash 脚本

git - 将两个 bash 命令 merge 为一个快捷方式提示符