8

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

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.

С чего мне начать взлом?

2 ответа2

7

В общем

В Linux Journal есть довольно хорошая статья:

Со страницы руководства 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 /command-not-found

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .