¿Cómo enseño bash en Ubuntu algunas palabras de maldición?

21

Cuando bash encuentra un comando desconocido (¿palabra?) Hace esto:

The program 'hello' can be found in the following packages:
 * hello
 * hello-debhelper
Try: sudo apt-get install <selected package>

Lo que me gustaría saber es cómo se hace esto para poder editarlo o agregar algo antes de él para verificar la palabra desconocida de un diccionario local que tendría una frase: pares de respuestas que luego se pueden enviar a la salida.

Soy culpable de no haberlo buscado lo suficiente ... pero las pocas guías de bash que intenté desenterrar no tenían nada sobre esto. Tal vez estoy mirando los lugares equivocados ... ¿algún puntero?

Y sí, estoy haciendo esto, así que cada vez que escribo wtf cuando falla un programa, quiero que me devuelvan algo agradable ...

NitinAb
fuente
1
Mientras estamos en eso, ¿cómo deshabilitas esto por completo?
user606723
2
@ user606723 ver askubuntu.com/q/72853/6969
Lekensteyn
Otro enlace útil: wiki.ubuntu.com/CommandNotFoundMagic
glenn jackman

Respuestas:

21

Busque en su /etc/bash.bashrcla command_not_found_handledefinición de la función.

Si desea eliminar ese comportamiento, colóquelo en su .bashrc

[[ $(type -t command_not_found_handle) = "function" ]] && 
  unset -f command_not_found_handle

Si quieres personalizar, puedes hacer

# see http://stackoverflow.com/questions/1203583/how-do-i-rename-a-bash-function
alias_function() {
  eval "${1}() $(declare -f ${2} | sed 1d)"
}

alias_function orig_command_not_found_handle command_not_found_handle 

command_not_found_handle() {
  command=$1
  shift
  args=( "$@" )

  do your stuff before
  orig_command_not_found_handle "$command" "${args[@]}"
  do your stuff after
}
Glenn Jackman
fuente
1
Me gusta este enfoque.
ændrük
1
¡Guauu! Me gustó la idea de alias_function :-)
anishsane
Para ver / verificar la definición actual, haga:declare -p -f command_not_found_handle
Randall
4

Esto podría ser potencialmente útil ...

El paquete de comando no encontrado es lo que te da la respuesta mágica. No estoy seguro de si es posible personalizarlo, pero vale la pena echarle un vistazo.

Otra opción para hacer lo que creo que intenta hacer sería agregar un alias a su archivo .bashrc que imprima un mensaje cada vez que escriba 'wtf' o algo así:

alias wtf='echo "chill out man"'

Agregue esto a su archivo ~ / .bashrc y luego haga: source $HOME/.bashrc

Esto simplemente imprimirá un mensaje cada vez que escriba wtfen su terminal. También puede hacer que este alias llame a un script que imprima un mensaje más detallado o algo similar. ¡Las posibilidades son infinitas!

jat255
fuente
3

Este comportamiento se define en el archivo de configuración Bash de todo el sistema /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 ]; 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/bin/python /usr/lib/command-not-found -- "$1"
      return $?
    elif [ -x /usr/share/command-not-found ]; then
      /usr/bin/python /usr/share/command-not-found -- "$1"
      return $?
    else
      return 127
    fi
  }
fi

Para personalizarlo, simplemente anule esta función en su propia ~/.bashrc:

function command_not_found_handle {
  echo "Sorry, smotchkiss, try again."
}
ændrük
fuente
0

@ user606723, si desea deshacerse de este comportamiento en su totalidad:

sudo apt-get remove command-not-found command-not-found-data 

Si eso no funciona, intente esto:

sudo apt-get purge command-not-found command-not-found-data 

Si desea recuperar el comportamiento:

sudo apt-get install command-not-found
jat255
fuente