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


9

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

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
Это может помочь: askubuntu.com/a/73282/10127
Гленн Джекман

Ответы:


8

В основном

В 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
Это поставило меня на правильный путь, но настоящей программой был скрипт на python, расположенный по адресу /usr/lib/command-not-found. На моей установке Ubuntu 14.04 файл /etc/bash_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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.