Conecte-se ao manipulador “command not found” no Ubuntu

8

Eu quero ligar ao 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 por meu próprio script.

Especificamente, quero verificar se o comando existe na saída de lsvirtualenv -b e, se for o caso, quero ativar esse virtualenv.

Onde devo começar a invadir?

    
por wim 24.07.2014 / 15:01

2 respostas

7

Em geral

O Linux Journal tem um artigo muito bom:

Da página de man do bash:

... A full search of the directories in PATH is performed only if the command is not found in the hash table. If the search is unsuccessful, the shell searches for a defined shell function named command_not_found_handle. If that function exists, it is invoked with the original command and the original command's arguments as its arguments, and the function's exit status becomes the exit status of the shell. If that function is not defined, the shell prints an error message and returns an exit status of 127.

e

A quick grep in /etc discovered where it was happening. The function itself is in /etc/bash_command_not_found and that function gets included (if it exists) in your bash session 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, entretanto, o arquivo correto é um script python, localizado em / usr / lib / command-not-found

    
por 24.07.2014 / 15:12
1

Para bash , seu comportamento é governado pela função de shell command_not_found_handle (consulte 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 função command_not_found_handle .

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
    
por 22.09.2017 / 21:56