Подключитесь к обработчику «команда не найдена» в Ubuntu

Подключитесь к обработчику «команда не найдена» в Ubuntu

Я хочу подключиться к обработчику для команды, которая не найдена

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/команда-не-найдена

Связанный контент