Conecte-se ao manipulador "comando não encontrado" no Ubuntu

9

Quero ligar para o manipulador para o comando não encontrado

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

Eu quero substituir esse comportamento pelo meu próprio script.

Especificamente, desejo verificar se o comando existe na saída de lsvirtualenv -be, se houver, desejo ativar esse virtualenv.

Onde devo começar a invadir?

wim
fonte
11
Isso pode ajudar: askubuntu.com/a/73282/10127
glenn jackman

Respostas:

8

Em geral

O Linux Journal tem um artigo muito bom:

Na página de manual do bash:

... Uma pesquisa completa dos diretórios no PATH é realizada apenas se o comando não for encontrado na tabela de hash. Se a pesquisa não tiver êxito, o shell procurará uma função de shell definida denominada command_not_found_handle. Se essa função existir, ela será chamada com o comando original e os argumentos do comando original como argumentos, e o status de saída da função se tornará o status de saída do shell. Se essa função não estiver definida, o shell imprimirá uma mensagem de erro e retornará um status de saída 127.

e

Um grep rápido no / etc descobriu onde estava acontecendo. A função em si está em / etc / bash_command_not_found e essa função é incluída (se existir) na sua sessão do bash via /etc/bash.bashrc.

Ubuntu 14.04

Evidências empíricas sugerem que em uma instalação do Ubuntu 14.04, o arquivo / etc / bash_command_not_found não existe, no entanto, o arquivo correto é um script python, localizado em / usr / lib / command-not-found

Andrew Stubbs
fonte
11
Isso me colocou no caminho certo, mas o programa atual era um script python localizado em /usr/lib/command-not-found. Na minha instalação do Ubuntu 14.04, o arquivo /etc/bash_command_not_foundnão existe.
23414 wim
Obrigado, eu adicionei isso na minha resposta para futuros espectadores.
Andrew Stubbs
1

Pois bash, seu comportamento é governado pela função shell command_not_found_handle(consulte man bash, em COMMAND EXECUTION).

Para ver qual comportamento é definido por essa função, você pode emitir:

declare -p -f command_not_found_handle

Você pode alterar qual programa é usado redefinindo a command_not_found_handlefunção.

No Ubuntu 14.04 LTS, parece que o comportamento padrão é definido diretamente em /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
fonte