Что делает _expand?

12

Я работал с оболочкой, и по ошибке я автоматически заполнил tabпосле записи _e, что привело к _expand.

Что делает эта команда? Я не смог найти объяснения в Интернете, единственные ссылки, которые я мог найти здесь на Ask Ubuntu, были:

Но они не отвечают на мой вопрос. Вместо этого они открывают больше вопросов того же рода о таких командах, как _complete, _complete_as_rootи т. Д.

scristalli
источник

Ответы:

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которого содержат шаблон завершения.
хаос