¿Qué hace _expand?


12

Estaba trabajando con el shell y, por error, lo completé automáticamente tabdespués de escribir _e, lo que resultó en _expand.

¿Qué hace este comando? No pude encontrar una explicación en línea, las únicas referencias que pude encontrar aquí en Ask Ubuntu fueron:

Pero no responden mi pregunta. En su lugar, se abren más preguntas del mismo tipo sobre los comandos como _complete, _complete_as_root, etc.

Respuestas:


14

Puedes averiguar qué _expandhace, al escribir

$ type _expand
_expand is a function
_expand ()
{
    if [[ "$cur" == \~*/* ]]; then
        eval cur=$cur;
    else
        if [[ "$cur" == \~* ]]; then
            cur=${cur#\~};
            COMPREPLY=($( compgen -P '~' -u "$cur" ));
            [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
            return ${#COMPREPLY[@]};
        fi;
    fi
}

Esta es una función en el mecanismo de finalización de bash. Expande tildes ( ~) en los nombres de ruta. En /etc/bash_completionhay un comentario sobre la función:

# Expand ~username type directory specifications.  We want to expand
# ~foo/... to /home/foo/... to avoid problems when $cur starting with
# a tilde is fed to commands and ending up quoted instead of expanded.

Pruébelo en una terminal, escriba:

~<tab><tab>

Se expandirá a los nombres de usuario, por ejemplo

~usera     ~userb     ~userc

1
Gracias, no conocía el comando type. No estaba claro por qué no podía llamar a estas funciones _function_name [argument], pero ahora entiendo que cumplen su función como extensiones de autocompletar, y el hecho de que aparezcan en mi autocompletar es simplemente porque están declaradas (pero no están destinadas ser llamado directamente).
scristalli

3
Exactamente la _expandfunción, como todas las demás funciones completas, solo manipula la COMPREPLYmatriz, en función de los valores $curque contienen el patrón de finalización.
caos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.