Was macht _expand?

12

Ich habe mit der Shell gearbeitet und habe sie versehentlich tabnach dem Schreiben automatisch vervollständigt _e, was zu folgte _expand.

Was macht dieser Befehl? Ich konnte online keine Erklärung finden. Die einzigen Referenzen, die ich hier auf Ask Ubuntu finden konnte, waren:

Aber sie beantworten meine Frage nicht. Stattdessen öffnen sie über Befehle wie weitere Fragen der gleichen Art up _complete, _complete_as_rootetc.

scristalli
quelle

Antworten:

14

Sie können _expandbeim Tippen herausfinden, was passiert

$ 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
}

Dies ist eine Funktion im Bash-Vervollständigungsmechanismus. Es erweitert tildes ( ~) in Pfadnamen. In /etc/bash_completionist ein Kommentar zur Funktion:

# 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.

Versuchen Sie es in einem Terminal, geben Sie Folgendes ein:

~<tab><tab>

Es wird zum Beispiel auf die Benutzernamen erweitert

~usera     ~userb     ~userc
Chaos
quelle
1
Danke, ich kannte den Befehl nicht type. Es war mir nicht klar, warum ich diese Funktionen nicht als aufrufen konnte _function_name [argument], aber jetzt verstehe ich, dass sie ihren Zweck als Autocomplete-Erweiterungen erfüllen, und dass sie in meinem Autocomplete erscheinen, liegt einfach daran, dass sie deklariert sind (aber nicht gemeint sind direkt angerufen werden).
Scristalli
3
Genau die _expandFunktion manipuliert wie alle anderen vollständigen Funktionen nur das COMPREPLYArray, basierend auf Werten, $curdie das Vervollständigungsmuster enthalten.
Chaos