Co robi _expand?

12

Pracowałem z powłoką i przez pomyłkę automatycznie się wypełniłem tabpo napisaniu _e, co spowodowało _expand.

Co robi to polecenie? Nie mogłem znaleźć wyjaśnienia online, jedyne odniesienia, które mogłem znaleźć tutaj na Ask Ubuntu, to:

Ale nie odpowiadają na moje pytanie. Zamiast tego otworzy kolejne pytania tego samego rodzaju o takich poleceń _complete, _complete_as_rootitp

scristalli
źródło

Odpowiedzi:

14

_expandPodczas pisania możesz dowiedzieć się, co robi

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

Jest to funkcja w mechanizmie zakończenia bashu. Rozwija tyldę ( ~) w ścieżkach. W /etc/bash_completionjest komentarz na temat funkcji:

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

Wypróbuj w terminalu, wpisz:

~<tab><tab>

Rozszerzy się na przykład na nazwy użytkowników

~usera     ~userb     ~userc
chaos
źródło
1
Dzięki, nie znałem polecenia type. Nie było dla mnie jasne, dlaczego nie mogłem nazwać tych funkcji jako _function_name [argument], ale teraz rozumiem, że służą one celom jako rozszerzenia autouzupełniania, a fakt, że pojawiają się w moim autouzupełnianiu, jest po prostu dlatego, że zostały zadeklarowane (ale nie są przeznaczone do bezpośredniego połączenia).
scristalli
3
Dokładnie ta _expandfunkcja, podobnie jak wszystkie inne kompletne funkcje, po prostu manipuluje COMPREPLYtablicą, w oparciu o wartości, $curktóre zawierają wzorzec uzupełnienia.
chaos