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"
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 Testé sur WSL, ça marche.command_not_found_handle
lui-même, cela ne fonctionnera pas).
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
}