Co powoduje, że bash zatrzymuje się po złym poleceniu?

23

Podczas wpisywania złego polecenia powiedz, że chcesz:

$ cd ..
$ ls

Zamiast tego piszesz zbyt szybko i kończysz uderzaniem, wpisując między ls, więc otrzymujesz:

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

Dzieje się tak przez cały czas, kiedy piszemy szybko. Interesuje mnie źródło 2,5-sekundowej pauzy (w moim systemie) po pojawieniu się złego tekstu polecenia na ekranie. Wydaje mi się, że natychmiast rozpoznaje złe polecenie, drukuje komunikat o błędzie, ale potem dla zabawy czeka 2,5 sekundy przed powrotem do wiersza poleceń. Co to powoduje? Czy można to naprawić? To mała irytacja, ale chciałbym się jej pozbyć. :)

Edycja: działający system Fedora 16

Fuu
źródło
Zapomniałeś wspomnieć na jakim systemie operacyjnym jesteś.
Daniel Beck
whoa, nie masz na imię Ali? :)
dotjoe

Odpowiedzi:

42

Ten typ zachowania jest spowodowany przez narzędzie często instalowane w niektórych dystrybucjach, które przechwytują bash. Ten haczyk sprawia, że ​​jeśli spróbujesz uruchomić polecenie, a polecenie nie istnieje, wówczas bash przeszuka pliki dostępne w skonfigurowanych repozytoriach i powie ci, jaki pakiet należy zainstalować, aby uzyskać to polecenie.

Jeśli nie korzystasz z systemu Debian, powinieneś spojrzeć na profile plików startowych bash itd. I sprawdzić, czy coś definiuje funkcję o nazwie command_not_found_handle. Jeśli ta funkcja bash jest zdefiniowana, będzie wywoływana za każdym razem, gdy uruchomisz polecenie, a na ścieżce wyszukiwania nie będzie można znaleźć odpowiedniego programu. Jeśli uruchomisz typset | lessi przejrzysz wyjście, zobaczysz command_not_found_handle()funkcję, jeśli została zdefiniowana.

W systemie Debian / Ubuntu pakiet, który zapewnia takie zachowanie, nie został znaleziony . Jeśli to wyczyścisz, wyłączysz wyszukiwanie, co spowolni działanie.

Oto przykład

# 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

Dokładny czas będzie oczywiście dla ciebie inny. Testy przeprowadziłem na dość mocnym serwerze.

Zoredache
źródło
10
W moim przypadku w Fedorze okazało się, że jest to pakiet o nazwie: PackageKit-command-not-found
Fuu
6

Część pytania brzmiała: „Czy istnieje sposób, aby to naprawić (w Fedorze)?” Jest: na dole pliku .bashrc dodaj polecenie

unset command_not_found_handle

Prawdopodobnie zechcesz to zrobić na końcu .bashrc (lub blisko niego), ponieważ możesz uruchomić / etc / bashrc lub inne skrypty bash na górze .bashrc.

Scott C. Wilson
źródło
5

W Fedorze to zachowanie można kontrolować, zmieniając /etc/PackageKit/CommandNotFound.confplik konfiguracyjny.

Ustawienie SoftwareSourceSearch=falsepozbywa się opóźnienia, ponieważ nie będzie próbował zlokalizować pakietu za pomocą brakującego polecenia za pomocą menedżera pakietów.

Możesz także zmienić czas oczekiwania na wyszukiwanie pakietu, zmieniając MaxSearchTime=2000opcję wskazania liczby milisekund, na jaką chcesz czekać, aby wyszukiwanie pakietu zwróciło dopasowanie. Uważam, że domyślna wartość 2 sekund nie jest wystarczająco długa, aby zwrócić jakiekolwiek dopasowania, i powoduje niepożądane opóźnienie, gdy masz literówkę.

Zwiększyć, MaxSearchTimeaby zapewnić użyteczne dane wyjściowe, lub wyłączyć, SoftwareSourceSearchaby całkowicie wyeliminować opóźnienie.

Aner
źródło