
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 -b
e, 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_handle
funçã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