Archivos completos de un directorio diferente en bash

Archivos completos de un directorio diferente en bash

Escribí dos funciones pushy pullcopiar archivos hacia y desde un directorio ( $FILE_EXCHANGE_DIR). Quiero que bash complete automáticamente los nombres de ese directorio cuando uso la pullfunción. Quiero que el autocompletado solo tome nombres de dicho directorio. En el formulario actual, mi autocompletado también encuentra nombres de archivos en el directorio actual, independientemente de si hubo una coincidencia en el directorio de origen ( $FILE_EXCHANGE_DIR) o no.

Aquí hay dos versiones de la función a la que pasé complete. Ninguno de los dos funcionó.

_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;
}

Al final lo hago

complete -f -F _pull pull

¿Existe una buena manera de completar nombres solo de un directorio (que no es el actual) y no del actual? Incluso en el caso de que no hubiera ninguna coincidencia en la fuente (¿cuál debería ser la readlinefinalización predeterminada de forma predeterminada?

Respuesta1

Si entendí correctamente, esto debería ser lo que estás buscando:

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

Incluso escapa espacios en los nombres de archivos.

Tenga en cuenta que -o defaultse completa con readlineel valor predeterminado de , pero en realidad no parece ser nada a menos que lo establezca explícitamente en algún lugar ( .initrc?). Si desea nombres de archivos, utilice -o filenameso quédese con -f.

información relacionada