Comment enseigner à bash dans Ubuntu quelques mots maudits?

21

Quand bash rencontre une commande inconnue (mot?), Il fait ceci:

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

ce que je voudrais savoir, c'est comment cela est fait pour que je puisse le modifier ou ajouter quelque chose avant de recouper le mot inconnu d'un dictionnaire local qui aurait la phrase: des paires de réponses qui peuvent ensuite être envoyées en sortie.

Je suis coupable de ne pas en avoir cherché assez autour ... mais les quelques guides bash que j'ai essayé de déterrer n'avaient rien à ce sujet. Peut-être que je regarde les mauvais endroits .. des conseils?

Et oui, je le fais donc chaque fois que je tape wtf quand un programme échoue, je veux que quelque chose de gentil me soit renvoyé ...

NitinAb
la source
1
Pendant que nous y sommes, comment désactivez-vous tout cela?
user606723
2
@ user606723 voir askubuntu.com/q/72853/6969
Lekensteyn
Un autre lien utile: wiki.ubuntu.com/CommandNotFoundMagic
glenn jackman

Réponses:

21

Recherchez dans votre définition /etc/bash.bashrcde la command_not_found_handlefonction.

Si vous souhaitez supprimer ce comportement, mettez-le dans votre .bashrc

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

Si vous souhaitez personnaliser, vous pouvez le faire

# 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
la source
1
J'aime cette approche.
ændrük
1
Hou la la! J'ai aimé l'idée d'alias_function :-)
anishsane
Pour voir / vérifier la définition actuelle, faites:declare -p -f command_not_found_handle
Randall
4

Cela pourrait être potentiellement utile ...

Le package de commande introuvable est ce qui vous donne la réponse magique. Je ne sais pas s'il est possible de le personnaliser, mais cela pourrait valoir le coup d'œil.

Une autre option pour faire ce que je pense que ce que vous essayez de faire serait d'ajouter un alias à votre fichier .bashrc qui imprime un message chaque fois que vous tapez 'wtf' ou quelque chose comme ça:

alias wtf='echo "chill out man"'

Ajoutez-le à votre fichier ~ / .bashrc, puis procédez comme suit: source $HOME/.bashrc

Il suffit alors d'imprimer un message chaque fois que vous tapez wtfdans votre terminal. Vous pouvez également faire de cet alias un script qui imprime un message plus détaillé ou quelque chose de similaire. Les possibilités sont infinies!

jat255
la source
3

Ce comportement est défini dans le fichier de configuration Bash à l'échelle du système /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

Pour le personnaliser, remplacez simplement cette fonction par vous-même ~/.bashrc:

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

@ user606723, si vous voulez vous débarrasser de ce comportement dans son intégralité:

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

Si cela ne fonctionne pas, essayez ceci:

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

Si vous souhaitez récupérer le comportement:

sudo apt-get install command-not-found
jat255
la source