web-dev-qa-db-fra.com

Que fait _expand?

Je travaillais avec Shell et, par erreur, j’ai complété moi-même avec tab après avoir écrit _e, ce qui a abouti à _expand.

Que fait cette commande? Je n'ai pas trouvé d'explication en ligne, les seules références que j'ai pu trouver ici sur Ask Ubuntu étaient:

Mais ils ne répondent pas à ma question. Au lieu de cela, ils ouvrent plus de questions du même genre à propos de commandes telles que _complete, _complete_as_root, etc.

12
scristalli

Vous pouvez savoir ce que _expand fait en tapant

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

C'est une fonction du mécanisme d'achèvement de bash. Il développe les tildes (~) dans les noms de chemin. Dans /etc/bash_completion se trouve un commentaire sur la fonction:

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

Essayez-le dans un terminal, tapez:

~<tab><tab>

Il va s'étendre aux noms d'utilisateur, par exemple

~usera     ~userb     ~userc
14
chaos