Hook in den "Befehl nicht gefunden"-Handler in Ubuntu

Hook in den "Befehl nicht gefunden"-Handler in Ubuntu

Ich möchte mich in den Handler für den nicht gefundenen Befehl einklinken

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

Ich möchte dieses Verhalten durch mein eigenes Skript überschreiben.

Insbesondere möchte ich prüfen, ob der Befehl in der Ausgabe von vorhanden ist lsvirtualenv -b, und wenn ja, möchte ich diese virtuelle Umgebung aktivieren.

Wo soll ich mit dem Hacken beginnen?

Antwort1

Für bashwird das Verhalten durch die Shell-Funktion bestimmt command_not_found_handle(siehe man bashunter BEFEHLSAUSFÜHRUNG).

Um zu sehen, welches Verhalten durch diese Funktion definiert wird, können Sie Folgendes eingeben:

declare -p -f command_not_found_handle

Sie können das verwendete Programm ändern, indem Sie die command_not_found_handleFunktion neu definieren.

In Ubuntu 14.04 LTS scheint das Standardverhalten direkt wie folgt definiert zu sein /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

Antwort2

Allgemein

DerLinux Journalhat einen ziemlich guten Artikel:

Von der Manpage von Bash:

... Eine vollständige Suche in den Verzeichnissen in PATH wird nur durchgeführt, wenn der Befehl nicht in der Hash-Tabelle gefunden wird. Wenn die Suche erfolglos ist, sucht die Shell nach einer definierten Shell-Funktion namens command_not_found_handle. Wenn diese Funktion vorhanden ist, wird sie mit dem ursprünglichen Befehl und den Argumenten des ursprünglichen Befehls als Argumente aufgerufen, und der Beendigungsstatus der Funktion wird zum Beendigungsstatus der Shell. Wenn diese Funktion nicht definiert ist, gibt die Shell eine Fehlermeldung aus und gibt einen Beendigungsstatus von 127 zurück.

Und

Ein schnelles Grep in /etc hat herausgefunden, wo es passiert ist. Die Funktion selbst befindet sich in /etc/bash_command_not_found und diese Funktion wird (sofern vorhanden) über /etc/bash.bashrc in Ihre Bash-Sitzung aufgenommen.

Ubuntu 14.04

Empirische Beweise deuten darauf hin, dass bei einer Ubuntu 14.04-Installation die Datei /etc/bash_command_not_found nicht existiert. Die richtige Datei ist jedoch ein Python-Skript unter/usr/lib/Befehl nicht gefunden

verwandte Informationen