Что заставляет bash останавливаться после плохой команды?

23

Когда вы печатаете неверную команду, говорите, что хотите сделать:

$ cd ..
$ ls

Но вместо этого вы набираете слишком быстро и в итоге нажимаете ввод между l и s, так что вы получаете:

$ cd ..
$ l
sbash: l: command not found...

Это происходит все время, конечно, когда мы печатаем быстро. Что меня интересует, так это источник 2,5-секундной (в моей системе) паузы после появления на экране неверного текста команды. Мне кажется, он мгновенно распознает плохую команду, печатает сообщение об ошибке, но потом ради интереса ждет 2,5 секунды, прежде чем вернуть меня в командную строку. Что вызывает это? Есть ли способ исправить это? Это немного раздражает, но я бы хотел избавиться от этого. :)

Изменить: Запуск системы Fedora 16

Fuu
источник
Вы забыли упомянуть, на какой ОС вы работаете.
Даниэль Бек
Вау, ты не псевдоним ls для ls? :)
dotjoe

Ответы:

42

Этот тип поведения вызван тем, что инструмент часто устанавливается в некоторых дистрибутивах, которые подключаются к bash. Этот хук делает так, что если вы пытаетесь запустить команду, а команда не существует, то bash будет искать файлы, доступные в настроенных репозиториях, и сообщать вам, какой пакет вам нужно установить, чтобы получить эту команду.

Если вы не работаете в системе Debian, вам нужно просмотреть профили загрузочных файлов bash и т. Д. И посмотреть, определяет ли что-нибудь названную функцию command_not_found_handle. Если эта функция bash определена, то она будет вызываться всякий раз, когда вы запускаете команду, и соответствующая программа не может быть найдена в вашем пути поиска. Если вы запустите typset | lessи просмотрите выходные данные, вы увидите command_not_found_handle()функцию, если она была определена.

В Debian / Ubuntu пакет, обеспечивающий это поведение, не найден . Если вы очистите это, то вы отключите поиск, который замедляет работу.

Вот пример

# command-not-found installed
$ time pwgen
The program 'pwgen' is currently not installed.  To run 'pwgen' please ask your administrator to install the package 'pwgen'
pwgen: command not found

real    0m0.074s
user    0m0.032s
sys     0m0.040s

# purge command-not-found and restart bash
$ time pwgen
-bash: pwgen: command not found

real    0m0.002s
user    0m0.000s
sys     0m0.000s

Точное время, конечно, будет другим для вас. Я провел свои тесты на довольно мощном сервере.

Zoredache
источник
10
В моем случае в fedora оказался пакет с именем PackageKit-command-not-found
Fuu
6

Часть вопроса была: "Есть ли способ исправить это (в Fedora)?" Там есть: внизу вашего .bashrc файла добавьте команду

unset command_not_found_handle

Возможно, вы захотите сделать это в конце вашего .bashrc (или близко к нему), потому что вы можете запустить / etc / bashrc или другие скрипты bash в верхней части вашего .bashrc.

Скотт К Уилсон
источник
5

На fedora этим поведением можно управлять, изменив /etc/PackageKit/CommandNotFound.confфайл конфигурации.

Параметр SoftwareSourceSearch=falseизбавит от задержки, так как он не будет пытаться найти пакет с отсутствующей командой, используя менеджер пакетов.

Вы также можете изменить время ожидания поиска пакета, изменив MaxSearchTime=2000параметр, чтобы указать количество миллисекунд, которые вы готовы ждать, пока поиск пакета не вернет совпадение. Я считаю, что значение по умолчанию в 2 секунды недостаточно для возврата любых совпадений и просто вызывает нежелательную задержку, когда у вас есть опечатка.

Либо увеличьте, MaxSearchTimeчтобы обеспечить полезный вывод, либо отключите, SoftwareSourceSearchчтобы полностью исключить задержку.

Анер
источник