Como eu ensino bash no Ubuntu algumas palavrões?

21

Quando o bash encontra um comando desconhecido (palavra?), Ele faz o seguinte:

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

o que eu gostaria de saber é como isso é feito, para que eu possa editá-lo ou adicionar algo antes dele para cruzar a palavra desconhecida de um dicionário caseiro que teria frase: pares de respostas que podem ser enviados para a saída.

Sou culpado de não procurar o suficiente por aí .. mas os poucos guias do bash que tentei desenterrar não tinham nada a ver. Talvez eu esteja olhando para os lugares errados ... alguma dica?

E sim, estou fazendo isso, assim, toda vez que digito wtf quando um programa falha, quero algo de bom jogado de volta para mim ...

NitinAb
fonte
1
Enquanto estamos nisso, como você desativa isso completamente?
user606723
2
@ user606723 ver askubuntu.com/q/72853/6969
Lekensteyn
Outro link útil: wiki.ubuntu.com/CommandNotFoundMagic
glenn jackman

Respostas:

21

Procure em sua /etc/bash.bashrcpara a command_not_found_handledefinição da função.

Se você deseja remover esse comportamento, coloque-o no seu .bashrc

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

Se você deseja personalizar, pode fazer

# 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
fonte
1
Eu gosto dessa abordagem.
ændrük
1
Uau! Eu gostei da idéia de alias_function :-)
anishsane
Para ver / verificar a definição atual, faça:declare -p -f command_not_found_handle
Randall
4

Isso pode ser potencialmente útil ...

O pacote de comando não encontrado é o que fornece a resposta mágica. Não tenho certeza se é possível personalizá-lo, mas pode valer a pena dar uma olhada.

Outra opção para fazer o que eu acho que você está tentando fazer seria adicionar um alias ao seu arquivo .bashrc que imprime uma mensagem sempre que você digita 'wtf' ou algo assim:

alias wtf='echo "chill out man"'

Adicione isso ao seu arquivo ~ / .bashrc e faça: source $HOME/.bashrc

Isso imprimiria uma mensagem sempre que você digitasse wtfno seu terminal. Você também pode fazer com que esse alias chame um script que imprima uma mensagem mais detalhada ou algo semelhante. As possibilidades são infinitas!

jat255
fonte
3

Esse comportamento é definido no arquivo de configuração do Bash em todo o 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 personalizá-lo, basta substituir esta função por conta própria ~/.bashrc:

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

@ user606723, se você quiser se livrar desse comportamento em sua totalidade:

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

Se isso não funcionar, tente o seguinte:

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

Se você deseja recuperar o comportamento:

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