相关疑难解决方法(0)

bash中不同目录中的完整文件

我编写了两个函数push,pull用于将文件复制到目录 ( $FILE_EXCHANGE_DIR)和从目录复制文件。当我使用该pull功能时,我希望 bash 自动完成该目录中的名称。我希望自动完成功能仅从上述目录中获取名称。在当前表单中,我的自动完成功能还会查找当前目录中的文件名,无论源目录 ( $FILE_EXCHANGE_DIR)中是否存在匹配项。

这是我传递给 的函数的两个版本complete。他们都没有工作。

_pull () {
    local cmd="${1##*/}";
    local word=${COMP_WORDS[COMP_CWORD]};
    local line=${COMP_LINE};
    filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )

    local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )

    COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
    return 0;
}

_pull () 
{
    local word=${COMP_WORDS[COMP_CWORD]};
    local line=${COMP_LINE};
    local pat="$FILE_EXCHANGE_DIR/*"

    COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));

    i=0
    for item in "${COMPREPLY[@]}"; do
        COMPREPLY[$i]="${item##*/}"
        i+=1
    done;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后,我做

complete -f -F _pull …
Run Code Online (Sandbox Code Playgroud)

bash autocomplete

6
推荐指数
1
解决办法
4437
查看次数

使用 compgen 自动完成文件名

作为我正在编写的更大的自动完成功能的一部分,我想使用 compgen 生成文件列表。我阅读了compgenand的 bash 手册条目complete,从那里我认为该选项-G "*"将是解决方案。但是,我无法让它工作:无论我的输入如何,都会显示当前目录中的文件列表,即:

$ cmd <Tab>
aa bb cc
$ cmd a<Tab>
aa bb cc
$ cmd aa<Tab>
aa bb cc
Run Code Online (Sandbox Code Playgroud)

因此,我尝试通过使用来调试它complete,它支持与 compgen 相同的选项,但我得到了相同的结果:

$ complete -G "*" cmd
$ cmd a<Tab>
aa bb cc
Run Code Online (Sandbox Code Playgroud)

我也试过complete -o filenames,但这也不起作用..

bash autocomplete compgen

5
推荐指数
1
解决办法
5576
查看次数

标签 统计

autocomplete ×2

bash ×2

compgen ×1