de l'homme Bash page:
COMMANDE EXECUTION
[...]
Si le nom n'est ni une fonction shell ni un élément intégré et ne contient aucune barre oblique, bash recherche dans chaque élément du PATH
un répertoire contenant un fichier exécutable portant ce nom. Bash utilise une table de hachage pour se souvenir des chemins complets des fichiers exécutables (voir hash
sous COMMANDES SHELL BUILTIN ci-dessous). Une recherche complète des répertoires dans PATH
est effectuée uniquement si la commande n'est pas trouvée dans la table de hachage. Si la recherche échoue, le shell recherche une fonction shell définie nommée command_not_found_handle
. Si cette fonction existe, elle est invoquée avec la commande d'origine et les arguments de la commande d'origine comme arguments, et le statut de sortie de la fonction devient le statut de sortie du shell. Si cette fonction n'est pas définie, le shell affiche un message d'erreur et renvoie un état de sortie de 127.
Essayons ceci:
$ foobar
bash: foobar: command not found
$ function command_not_found_handle { echo "I'm so sorry, what is '$1'?"; }
$ foobar
I'm so sorry, what is 'foobar'?
Votre code d'initialisation du shell peut installer un plus utile command_not_found_handle
. Vous trouverez généralement ce type de code dans la configuration à l'échelle du système au /etc/bash.bashrc
ou dans un fichier provenant de celui-ci. Votre distribution peut y installer un gestionnaire pour appeler un programme externe qui interroge le gestionnaire de paquets de la distribution pour la commande ou les commandes "similaires". Pour votre Ubuntu, ceci serait implémenté dans le command-not-found
package.Les fichiers de configuration par défaut fournis par les distributions sont généralement très généraux. La fonction peut donc vérifier si le fichier binaire command-not-found
est installé et, le cas échéant, l'appeler ou afficher un message d'erreur simple.
function command_not_found_handle {
if [ -x /usr/bin/command-not-found ]
then
/usr/bin/command-not-found "$1"
else
echo "$1: Command not found" >&2
return 127
fi
}
De cette façon, le fichier de configuration ne doit pas être changé si le paquet command-not-found
est installé ou enlevé plus tard.
Je ne sais pas comment ce programme pour Ubuntu est implémenté mais typiquement, un tel outil aurait une liste de toutes les commandes connues et en trouverait la plus similaire. Il peut alors vérifier si ce programme est installé et, si ce n'est pas le cas, vérifier quel paquet le fournit et suggérer d'installer celui-ci.
La recherche de "texte similaire" est généralement effectuée en calculant le edit distance entre deux chaînes. Tenir compte de la probabilité de fautes de frappe d'une lettre donnée, étant donné la disposition actuelle du clavier, serait un ajout très intelligent.
Merci! Comment le savais-tu? Je veux dire d'une manière plus générale, disons sans SO, comment aurais-je découvert quelle fonction est appelée par exemple, juste la CLI? – Ketcomp
@Ketcomp: Lire 'man bash'. (C'est dans le troisième paragraphe de la section «COMMAND EXECUTION».) – rici