Podłącz się do modułu obsługi „nie znaleziono polecenia” w Ubuntu

9

Chcę podpiąć się do modułu obsługi dla polecenia nie znalezionego

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

Chcę zastąpić to zachowanie własnym skryptem.

W szczególności chcę sprawdzić, czy polecenie istnieje na wyjściu lsvirtualenv -b, a jeśli tak, chcę aktywować ten virtualenv.

Gdzie powinienem zacząć hakować?

wim
źródło
1
To może pomóc: askubuntu.com/a/73282/10127
glenn jackman

Odpowiedzi:

8

Ogólnie

Linux Journal ma całkiem dobry artykuł:

Ze strony podręcznika użytkownika bash:

... Pełne przeszukiwanie katalogów w PATH jest wykonywane tylko wtedy, gdy polecenia nie znaleziono w tabeli skrótów. Jeśli wyszukiwanie się nie powiedzie, powłoka szuka zdefiniowanej funkcji powłoki o nazwie polecenie_nazwa_funkcji_funkcji. Jeśli ta funkcja istnieje, jest wywoływana z oryginalnym poleceniem i argumentami oryginalnego polecenia jako argumentami, a status wyjścia funkcji staje się statusem wyjścia powłoki. Jeśli ta funkcja nie jest zdefiniowana, powłoka drukuje komunikat o błędzie i zwraca status wyjścia 127.

i

Szybki grep w / etc odkrył, gdzie to się dzieje. Sama funkcja znajduje się w / etc / bash_command_not_found i ta funkcja zostaje włączona (jeśli istnieje) do twojej sesji bash poprzez /etc/bash.bashrc.

Ubuntu 14.04

Dowody empiryczne sugerują, że w instalacji Ubuntu 14.04 plik / etc / bash_command_not_found nie istnieje, jednak poprawnym plikiem jest skrypt python, znajdujący się w / usr / lib / command-not-found

Andrew Stubbs
źródło
1
Ustawiło mnie to na właściwą ścieżkę, ale właściwym programem był skrypt w języku Python znajdujący się pod adresem /usr/lib/command-not-found. W mojej instalacji Ubuntu 14.04 plik /etc/bash_command_not_foundnie istnieje.
wim
Dzięki, dodałem to do mojej odpowiedzi dla przyszłych widzów
Andrew Stubbs,
1

Ponieważ bashjego zachowanie jest regulowane przez funkcję powłoki command_not_found_handle(patrz man bashponiżej WYKONANIE POLECEŃ).

Aby zobaczyć, jakie zachowanie definiuje ta funkcja, możesz wydać:

declare -p -f command_not_found_handle

Możesz zmienić program, który jest używany, ponownie definiując command_not_found_handlefunkcję.

W Ubuntu 14.04 LTS wydaje się, że domyślne zachowanie jest zdefiniowane bezpośrednio w /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
źródło