Conéctese al controlador de "comando no encontrado" en Ubuntu

Conéctese al controlador de "comando no encontrado" en Ubuntu

Quiero conectarme al controlador para el comando no 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

Quiero anular este comportamiento con mi propio script.

Específicamente, quiero verificar si el comando existe en la salida de lsvirtualenv -by, de ser así, quiero activar ese virtualenv.

¿Dónde debería empezar a hackear?

Respuesta1

Para bash, su comportamiento se rige por la función de shell command_not_found_handle(consulte man bash, en EJECUCIÓN DE COMANDOS).

Para ver qué comportamiento define esa función, puede emitir:

declare -p -f command_not_found_handle

Puede cambiar qué programa se utiliza redefiniendo la command_not_found_handlefunción.

En Ubuntu 14.04 LTS, parece que el comportamiento predeterminado se define directamente en /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

Respuesta2

En general

ElDiario de Linuxtiene un artículo bastante bueno:

Desde la página de manual de bash:

... Se realiza una búsqueda completa de los directorios en PATH solo si el comando no se encuentra en la tabla hash. Si la búsqueda no tiene éxito, el shell busca una función de shell definida denominada command_not_found_handle. Si esa función existe, se invoca con el comando original y los argumentos del comando original como argumentos, y el estado de salida de la función se convierte en el estado de salida del shell. Si esa función no está definida, el shell imprime un mensaje de error y devuelve un estado de salida de 127.

y

Una búsqueda rápida en /etc descubrió dónde estaba sucediendo. La función en sí está en /etc/bash_command_not_found y esa función se incluye (si existe) en su sesión de bash a través de /etc/bash.bashrc.

ubuntu 14.04

La evidencia empírica sugiere que en una instalación de Ubuntu 14.04, el archivo /etc/bash_command_not_found no existe; sin embargo, el archivo correcto es un script de Python, ubicado en/usr/lib/comando-no-encontrado

información relacionada