Connectez-vous au gestionnaire «commande introuvable» dans Ubuntu

9

Je veux me connecter au gestionnaire pour une commande introuvable

wim@SDFA100461C:~$ thing
No command 'thing' found, did you mean:
 Command 'tping' from package 'lam-runtime' (universe)
 Command 'thin' from package 'thin' (universe)
thing: command not found

Je veux remplacer ce comportement avec mon propre script.

Plus précisément, je veux vérifier si la commande existe dans la sortie de lsvirtualenv -b, et si c'est le cas, je veux activer ce virtualenv.

Où dois-je commencer le piratage?

wim
la source
1
Cela pourrait aider: askubuntu.com/a/73282/10127
glenn jackman

Réponses:

8

En général

Le Linux Journal a un assez bon article:

Depuis la page de manuel de bash:

... Une recherche complète des répertoires dans PATH n'est effectuée que si la commande n'est pas trouvée dans la table de hachage. Si la recherche échoue, le shell recherche une fonction de 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 l'état de sortie de la fonction devient l'état de sortie du shell. Si cette fonction n'est pas définie, le shell imprime un message d'erreur et renvoie un état de sortie de 127.

et

Un rapide grep dans / etc a découvert où cela se passait. La fonction elle-même se trouve dans / etc / bash_command_not_found et cette fonction est incluse (si elle existe) dans votre session bash via /etc/bash.bashrc.

Ubuntu 14.04

Des preuves empiriques suggèrent que sur une installation Ubuntu 14.04, le fichier / etc / bash_command_not_found n'existe pas, cependant, le fichier correct est un script python, situé dans / usr / lib / command-not-found

Andrew Stubbs
la source
1
Cela m'a mis sur la bonne voie, mais le programme réel était un script python situé à /usr/lib/command-not-found. Sur mon installation Ubuntu 14.04, le fichier /etc/bash_command_not_foundn'existe pas.
wim
Merci, j'ai ajouté cela dans ma réponse pour les futurs téléspectateurs
Andrew Stubbs
1

Pour bash, son comportement est régi par la fonction shell command_not_found_handle(Voir man bash, sous EXÉCUTION DE COMMANDE).

Pour voir quel comportement est défini par cette fonction, vous pouvez émettre:

declare -p -f command_not_found_handle

Vous pouvez changer le programme utilisé en redéfinissant la command_not_found_handlefonction.

Dans Ubuntu 14.04 LTS, il semble que le comportement par défaut soit défini directement dans /etc/bash.bashrc:

# if the command-not-found package is installed, use it
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
Randall
la source