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

Woj*_*tek 6 bash autocomplete

我编写了两个函数pushpull用于将文件复制到目录 ( $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 pull
Run Code Online (Sandbox Code Playgroud)

是否有一种仅从一个目录(不是当前目录)而不是从当前目录中完成名称的好方法?即使在源中没有匹配的情况下(应该默认为readline默认完成?

Kev*_*vin 8

如果我理解正确,这应该是你要找的:

_pull () {
    # Set
    IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
    COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull
Run Code Online (Sandbox Code Playgroud)

它甚至会转义文件名中的空格。

请注意,-o defaultreadline's default 结尾,但除非您在某处(.initrc?)显式设置它,否则它实际上并没有什么意义。如果您想要文件名,请使用-o filenames或坚持使用-f.