Підключіться до обробника "не знайдено" команди в 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
glenn jackman

Відповіді:


8

В загальному

У журналі Linux є досить непогана стаття:

З сторінки чоловіка Bash:

... Повний пошук каталогів у PATH виконується лише у тому випадку, якщо команда не знайдена в хеш-таблиці. Якщо пошук не вдався, оболонка здійснює пошук визначеної функції оболонки з назвою command_not_found_handle. Якщо ця функція існує, вона викликається оригінальною командою та аргументами оригінальної команди як її аргументи, а статус виходу функції стає статусом виходу оболонки. Якщо ця функція не визначена, оболонка друкує повідомлення про помилку та повертає статус виходу 127.

і

Швидкий прийом в / і т.д. виявив, де це відбувається. Сама функція знаходиться в / etc / bash_command_not_found, і ця функція включається (якщо вона існує) у ваш сеанс bash через /etc/bash.bashrc.

Ubuntu 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не існує.
Вім

Дякую, я додав це у свою відповідь для майбутніх глядачів
Andrew Stubbs

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.