In Ubuntu in den Handler "command not found" einbinden

1782
wim

Ich möchte in den Handler für Befehl nicht gefunden gefunden werden

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 prüfen, ob der Befehl in der Ausgabe von vorhanden ist lsvirtualenv -b, und wenn dies der Fall ist, möchte ich diese virtualenv aktivieren.

Wo soll ich anfangen zu hacken?

8
Dies könnte hilfreich sein: http://askubuntu.com/a/73282/10127 glenn jackman vor 9 Jahren 1

2 Antworten auf die Frage

7
Andrew Stubbs

Im Algemeinen

Das Linux Journal hat einen ziemlich guten Artikel:

Von der Manpage von bash:

... Eine vollständige Suche der Verzeichnisse in PATH wird nur durchgeführt, wenn der Befehl nicht in der Hashtabelle gefunden wird. Wenn die Suche nicht erfolgreich 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 Argument aufgerufen, und der Exitstatus der Funktion wird zum Exitstatus der Shell. Wenn diese Funktion nicht definiert ist, gibt die Shell eine Fehlermeldung aus und gibt den Beendigungsstatus 127 zurück.

und

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

Ubuntu 14.04

Empirische Beweise legen nahe, dass auf einer Ubuntu 14.04-Installation die Datei / etc / bash_command_not_found nicht vorhanden ist. Die korrekte Datei ist jedoch ein Python-Skript unter / usr / lib / command-not-found

Dies brachte mich auf den richtigen Weg, aber das eigentliche Programm war ein Python-Skript unter `/ usr / lib / command-not-found '. Bei meiner Ubuntu 14.04-Installation ist die Datei `/ etc / bash_command_not_found` nicht vorhanden. wim vor 9 Jahren 1
Danke, ich habe das in meine Antwort für zukünftige Zuschauer aufgenommen Andrew Stubbs vor 9 Jahren 0
1
Randall

Denn bashsein Verhalten wird von der Shell-Funktion bestimmt command_not_found_handle(siehe man bashCOMMAND EXECUTION).

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 das verwendete Programm ändern, 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