Как мне научить bash в Ubuntu ругательствам?

21

Когда bash встречает неизвестную команду (слово?), Она делает это:

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

я хотел бы знать, как это сделать, чтобы я мог отредактировать его или добавить что-то перед ним, чтобы перепроверить неизвестное слово из домашнего словаря, в котором были бы пары фраза: ответ, которые затем можно было бы отправить на выход.

Я виновен в том, что не искал достаточно для этого вокруг ... но у немногих гидов Баша, которые я пытался выкопать, не было ничего по этому поводу. Может быть, я смотрю в неправильных местах .. какие-либо указатели?

И да, я делаю это, поэтому каждый раз, когда я печатаю wtf, когда программа завершается сбоем, я хочу, чтобы что-то приятное было мне возвращено ...

NitinAb
источник
1
Пока мы на этом, как вообще отключить это?
user606723 28.10.11
2
@ user606723 см. askubuntu.com/q/72853/6969
Лекенштейн
Еще одна полезная ссылка: wiki.ubuntu.com/CommandNotFoundMagic
Гленн Джекман

Ответы:

21

Посмотрите в вашем /etc/bash.bashrcдля command_not_found_handleопределения функции.

Если вы хотите удалить это поведение, поместите это в ваш .bashrc

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

Если вы хотите настроить, вы можете сделать

# 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
}
Гленн Джекман
источник
1
Мне нравится этот подход.
Ондрюк,
1
Вот Это Да! Мне понравилась идея alias_function :-)
anishsane
Чтобы увидеть / проверить текущее определение, сделайте:declare -p -f command_not_found_handle
Рэндалл
4

Это может быть потенциально полезно ...

Пакет "команда не найден" - это то, что дает вам волшебный ответ. Я не уверен, возможно ли настроить его, но это может стоить посмотреть.

Другой вариант сделать то, что я думаю, что вы пытаетесь сделать, это добавить псевдоним в ваш файл .bashrc, который печатает сообщение всякий раз, когда вы набираете «wtf» или что-то в этом роде:

alias wtf='echo "chill out man"'

Добавьте это в файл ~ / .bashrc, а затем выполните: source $HOME/.bashrc

Это тогда просто напечатать сообщение всякий раз, когда вы вводите wtfв свой терминал. Вы также можете заставить этот псевдоним вызывать скрипт, который печатает более подробное сообщение или что-то подобное. Возможности безграничны!

jat255
источник
3

Это поведение определено в общесистемном файле конфигурации Bash /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

Чтобы настроить его, просто переопределите эту функцию по-своему ~/.bashrc:

function command_not_found_handle {
  echo "Sorry, smotchkiss, try again."
}
ændrük
источник
0

@ user606723, если вы хотите полностью избавиться от этого поведения:

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

Если это не сработает, попробуйте это:

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

Если вы хотите вернуть поведение:

sudo apt-get install command-not-found
jat255
источник