web-dev-qa-db-fra.com

Ajouter une extension par défaut à la recherche exécutable

J'utilise Ubuntu sous Windows après la mise à jour des créateurs et je me suis rendu compte qu'il pouvait désormais exécuter Windows Exe en natif. Il inclut également par défaut le chemin Windows à la fin du chemin Ubuntu, ce qui vous permet d'accéder à tous les utilitaires Windows dès le début.

Le seul problème est que les exécutables Windows ont l'extension (.exe), donc si par exemple j'ai 7z pour Windows dans le chemin, dans le bash je dois encore taper

7z.exe

Pour l'utiliser.

Je voudrais le mettre en quelque sorte à taper

7z

et il cherche à la fois 7z et 7z.exe.

Existe-t-il un moyen d’ajouter une ou plusieurs extensions par défaut, comme par exemple "si vous ne la trouvez pas telle que je l’écris, essayez d’ajouter cette ou ces extensions à la fin"

5
bracco23

Si vous êtes prêt à perdre les fonctionnalités par défaut de commande introuvable (qui recherchent les packages fournissant la commande, etc.), définissez une fonction command_not_found_handle qui teste si une version .exe est disponible dans le PATH:

command_not_found_handle ()
{
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        return 127;
    fi
}

Par exemple, tester avec sh au lieu de .exe:

$ z
z: command not found
$ command_not_found_handle () { if command -v "$1"sh; then "$1"sh "${@:2}"; return $?; else return 127; fi; }
$ z -c 'echo "$@"' _ b c
/usr/bin/zsh
b c
$ ba -c 'echo "$@"' _ b c
/bin/bash
b c

Bien sûr, cela dépend de la manière dont WSL s’accroche à bash pour fournir un accès aux commandes Windows (si WSL utilise command_not_found_handle lui-même, cela ne fonctionnera pas). Testé sur WSL, ça marche.


La définition par défaut d'origine de command_not_found_handle se trouve dans /etc/bash.bashrc:

$ tail -15 /etc/bash.bashrc
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                Elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi

Vous pouvez simplement inclure ce code dans la redifinition:

command_not_found_handle ()
{
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        # check because c-n-f could've been removed in the meantime
        if [ -x /usr/lib/command-not-found ]; then
           /usr/lib/command-not-found -- "$1"
           return $?
        Elif [ -x /usr/share/command-not-found/command-not-found ]; then
           /usr/share/command-not-found/command-not-found -- "$1"
           return $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    fi
}

Ou bien, utilisez cette astuce pour insérer automatiquement l'ancienne définition:

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
    if command -v "$1".exe; then
        "$1".exe "${@:2}";
        return $?;
    else
        original_command_not_found_handle "$@"
    fi
}
4
muru