
Я хочу подключиться к обработчику для команды, которая не найдена
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
Я хочу переопределить это поведение с помощью своего собственного скрипта.
В частности, я хочу проверить, существует ли команда в выводе lsvirtualenv -b
, и если да, то я хочу активировать это virtualenv.
С чего мне начать взлом?
решение1
Для bash
его поведение регулируется функцией оболочки command_not_found_handle
(см man bash
. раздел ВЫПОЛНЕНИЕ КОМАНДЫ).
Чтобы увидеть, какое поведение определяется этой функцией, вы можете выполнить:
declare -p -f command_not_found_handle
Вы можете изменить используемую программу, переопределив функцию command_not_found_handle
.
В Ubuntu 14.04 LTS поведение по умолчанию, похоже, определено непосредственно в /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
решение2
В общем
TheЖурнал Linuxесть довольно хорошая статья:
Из страницы руководства bash:
... Полный поиск по каталогам в PATH выполняется только в том случае, если команда не найдена в хэш-таблице. Если поиск не удался, оболочка ищет определенную функцию оболочки с именем command_not_found_handle. Если эта функция существует, она вызывается с исходной командой и ее аргументами в качестве аргументов, а статус выхода функции становится статусом выхода оболочки. Если эта функция не определена, оболочка выводит сообщение об ошибке и возвращает статус выхода 127.
и
Быстрый grep в /etc обнаружил, где это происходит. Сама функция находится в /etc/bash_command_not_found, и эта функция включается (если она существует) в ваш сеанс bash через /etc/bash.bashrc.
Убунту 14.04
Эмпирические данные свидетельствуют о том, что в установке Ubuntu 14.04 файл /etc/bash_command_not_found не существует, однако правильный файл — это скрипт Python, расположенный по адресу/usr/lib/команда-не-найдена