Haken Sie den Handler "Befehl nicht gefunden" in Ubuntu ein

9

Ich möchte mich in den Handler einbinden, damit der Befehl nicht gefunden wird

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 mit meinem eigenen Skript überschreiben.

Insbesondere möchte ich überprü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 anfangen zu hacken?

wim
quelle
1
Dies könnte helfen: askubuntu.com/a/73282/10127
Glenn Jackman

Antworten:

8

Allgemein

Das Linux Journal hat einen ziemlich guten Artikel:

Aus 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 nicht erfolgreich ist, sucht die Shell nach einer definierten Shell-Funktion mit dem Namen command_not_found_handle. Wenn diese Funktion vorhanden ist, wird sie mit dem ursprünglichen Befehl und den Argumenten des ursprünglichen Befehls als Argument aufgerufen, und der Exit-Status der Funktion wird zum Exit-Status der Shell. Wenn diese Funktion nicht definiert ist, gibt die Shell eine Fehlermeldung aus und gibt den Beendigungsstatus 127 zurück.

und

Ein kurzer Blick in / etc entdeckte, wo es geschah. Die Funktion selbst befindet sich in / etc / bash_command_not_found und diese Funktion wird (falls vorhanden) über /etc/bash.bashrc in Ihre Bash-Sitzung aufgenommen.

Ubuntu 14.04

Empirische Daten deuten darauf hin, dass bei einer Ubuntu 14.04-Installation die Datei / etc / bash_command_not_found nicht vorhanden ist. Die richtige Datei ist jedoch ein Python-Skript, das sich unter / usr / lib / command-not-found befindet

Andrew Stubbs
quelle
1
Dies brachte mich auf den richtigen Weg, aber das eigentliche Programm war ein Python-Skript unter /usr/lib/command-not-found. In meiner Ubuntu 14.04-Installation existiert die Datei /etc/bash_command_not_foundnicht.
wim
Danke, ich habe das in meine Antwort für zukünftige Zuschauer aufgenommen
Andrew Stubbs
1

Denn bashsein Verhalten wird von der Shell-Funktion bestimmt command_not_found_handle(siehe man bashunter BEFEHLSAUSFÜHRUNG).

Um zu sehen, welches Verhalten von dieser Funktion definiert wird, können Sie Folgendes ausgeben:

declare -p -f command_not_found_handle

Sie können ändern, welches Programm verwendet wird, indem Sie die command_not_found_handleFunktion neu definieren.

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