Command-not-found

Материал из Rosalab Wiki
Перейти к: навигация, поиск

«bash: foo: команда не найдена» — часто видите подобное сообщение? А хочется, чтобы кроме этого было еще и написано, почему она не найдена? Скажем, не установлен нужный пакет, или просто опечатка. Вероятно, не так уж мало людей зависали после следующих действий:

 $ rpmbuild
 bash: rpmbuild: команда не найдена
 
$ sudo urpmi rpmbuild
  Нет пакета с названием rpmbuild
  Следующие пакеты содержат rpmbuild: java-rpmbuild, rpmbuildupdate
  Чтобы выбрать все, используйте параметр «-a»


В том числе и для таких случаев был создан инструмент command-not-found для ROSA! Он является аналогом инструментов из других дистрибутивов, но для ROSA/Mandriva раньше его не было. Все что нужно для получения более дружественной консоли — установить пакет command-not-found и открыть новый терминал. Попробуйте написать что-то странное:

 $ foo
 Команда foo не найдена. Возможно, имелось в виду:
   Команда 'fio' из пакета пакет 'fio' (contrib)
   Команда 'fop' из пакета пакет 'fop' (main, установлен)
   Команда 'for' из пакета пакет 'execline' (contrib)
   Команда 'zoo' из пакета пакет 'zoo' (restricted)

Замечательно! Я же как раз zoo хотел вызвать, ошибся. (Кстати, замечаем что пакет fop у нас уже установлен, но в этот раз не он нам нужен)

 $ zoo
  Команда 'zoo' найдена в:
     пакет 'zoo' (restricted)
  Вы можете установить его, выполнив:
     urpmi zoo
 Хотите сделать это сейчас? (д/Н)

Все что остается — ввести «д» (или «y»). Не хотите получать предложения установить пакет? Установите переменную окружения COMMAND_NOT_FOUND_TURN_OFF_INSTALL_PROMPT=1, и больше Вам не будут задавать глупых вопросов.

Стоит заметить, что при вызове не через терминал (TTY) программа не будет выполнять никаких проверок и писать чего-то особого, она просто выведет «команда не найдена», как и просто bash. К тому же, что бы command-not-found ни написала, она всегда будет завершена с кодом 127, как это делает bash в таком случае.

Еще одна особенность command-not-found: анализ установленных пакетов и поиск запрашиваемой команды.

 $ ifconfig
  Команда 'ifconfig' найдена в:
     пакет 'net-tools' (main, установлен)
 Файл /sbin/ifconfig существует! Проверьте переменную окружения PATH или вызывайте команду, используя абсолютный путь.

Так же в составе command-not-found поставляется утилита «cnf», которая позволяет делать все то же самое, что описано выше (на самом деле она и вызывается каждый раз, когда bash не может выполнить команду). Иными словами, «cnf foo» даст тот же вывод, как если написать «foo» в консоли. Есть еще один сценарий использования cnf: программа уже установлена, но нужно узнать, из какого пакета она пришла.

Вероятно, к этому моменту Вы уже установили command-not-found. Если да — заметили что вместе с ним установился некий пакет command-not-found-data. Этот пакет содержит базу данных (файл в формате JSON), из которой берется информация при работе cnf. Но так как репозитории постоянно изменяются, информацию из этой базы нужно периодически обновлять, поэтому раз в неделю данный пакет автоматически пересобирается с актульными данными и приходит к Вам вместе с остальными обновлениями.

Надеемся, ваше общение с консолью станет намного более приятным :)

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.