Що робить _expand?


12

Я працював із оболонкою, і помилково я автоматично завершив роботу tabпісля написання _e, в результаті чого _expand.

Що робить ця команда? Я не зміг знайти пояснення в Інтернеті. Єдині посилання, які я міг знайти тут на Ask Ubuntu, були:

Але вони не відповідають на моє запитання. Замість цього, вони відкривають нові питання того ж роду серед команд вищої , як _complete, _complete_as_rootі т.д.

Відповіді:


14

Ви можете дізнатися, що _expandробить під час набору тексту

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

Це функція в механізмі завершення роботи bash. Він розширює тильди ( ~) в іменах шляхів. У /etc/bash_completionкоментарі щодо функції:

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

Спробуйте в терміналі, введіть:

~<tab><tab>

Наприклад, воно розшириться до імен користувачів

~usera     ~userb     ~userc

1
Дякую, я не знав команди type. Мені було незрозуміло, чому я не можу назвати ці функції як _function_name [argument], але тепер я розумію, що вони виконують свою мету як розширення з автозаповненням, і те, що вони з'являються в моєму автозаповнення, просто тому, що вони оголошені (але вони не мають на увазі називатися безпосередньо).
scristalli

3
Саме _expandфункція, як і всі інші повні функції, просто маніпулює COMPREPLYмасивом, на основі значень $curякого містить шаблон завершення.
хаос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.