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

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

Quero conectar-me ao manipulador de 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

Quero substituir esse comportamento por meu próprio script.

Especificamente, quero verificar se o comando existe na saída de lsvirtualenv -be, em caso afirmativo, quero ativar esse virtualenv.

Onde devo começar a hackear?

Responder1

Pois bash, seu comportamento é governado pela função shell command_not_found_handle(Veja man bash, em EXECUÇÃO DE COMANDO).

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

Responder2

Em geral

ODiário Linuxtem um artigo muito bom:

Na página de manual do bash:

... Uma pesquisa completa dos diretórios em PATH é realizada somente se o comando não for encontrado na tabela hash. Se a pesquisa não for bem-sucedida, o shell procurará uma função de shell definida chamada command_not_found_handle. Se essa função existir, ela será invocada com o comando original e os argumentos do comando original como seus 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 rápido grep em /etc descobriu onde isso estava acontecendo. A função em si está em /etc/bash_command_not_found e essa função é incluída (se existir) em sua sessão 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/comando não encontrado

informação relacionada