Wodurch wird die Bash nach einem schlechten Befehl angehalten?

23

Wenn Sie einen falschen Befehl eingeben, sagen Sie, dass Sie Folgendes tun möchten:

$ cd ..
$ ls

Aber stattdessen tippst du zu schnell und drückst am Ende die Eingabetaste zwischen l und s, sodass du Folgendes erhältst:

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

Das passiert natürlich die ganze Zeit, wenn wir schnell tippen. Ich bin gespannt auf die Quelle der Pause von 2,5 Sekunden (auf meinem System), nachdem der fehlerhafte Befehlstext auf dem Bildschirm angezeigt wurde. Mir scheint, dass es den fehlerhaften Befehl sofort erkennt, eine Fehlermeldung darüber ausgibt, aber dann nur zum Spaß 2,5 Sekunden wartet, bevor es mich zur Befehlszeile zurückbringt. Wodurch wird das verursacht? Gibt es eine Möglichkeit, dies zu beheben? Es ist ein kleines Ärgernis, aber ich möchte es loswerden. :)

Bearbeiten: Ausführen von Fedora 16-System

Fuu
quelle
Sie haben vergessen zu erwähnen, auf welchem ​​Betriebssystem Sie sich befinden.
Daniel Beck
whoa, du verstehst nicht alias l zu ls? :)
Dotjoe

Antworten:

42

Diese Art von Verhalten wird durch ein Tool verursacht, das häufig auf einigen Distributionen installiert wird, die sich in bash einbinden. Dieser Hook bewirkt, dass wenn Sie versuchen, einen Befehl auszuführen und dieser Befehl nicht vorhanden ist, bash die in den konfigurierten Repositorys verfügbaren Dateien durchsucht und Ihnen mitteilt, welches Paket Sie installieren müssten, um diesen Befehl zu erhalten.

Wenn Sie nicht auf einem Debian-System arbeiten, sollten Sie sich die Profile Ihrer Bash-Startdateien usw. ansehen und prüfen, ob irgendetwas die genannte Funktion definiert command_not_found_handle. Wenn diese Bash-Funktion definiert ist, wird sie jedes Mal aufgerufen, wenn Sie einen Befehl ausführen und ein entsprechendes Programm in Ihrem Suchpfad nicht gefunden wird. Wenn Sie typset | lessdie Ausgabe ausführen und durchsuchen, wird die command_not_found_handle()Funktion angezeigt, sofern sie definiert wurde.

Unter Debian / Ubuntu wurde das Paket, das dieses Verhalten bietet, nicht gefunden . Wenn Sie das bereinigen, deaktivieren Sie die Suchvorgänge, was die Dinge verlangsamt.

Hier ist ein Beispiel

# 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

Die genaue Uhrzeit wäre natürlich für Sie anders. Ich habe meine Tests auf einem ziemlich bulligen Server durchgeführt.

Zoredache
quelle
10
In meinem Fall in Fedora stellte sich heraus, dass es sich um ein Paket namens PackageKit-command-not-found handelte
Fuu
6

Ein Teil der Frage war "Gibt es eine Möglichkeit, dies zu beheben (in Fedora)?" Es gibt Folgendes: Fügen Sie am Ende Ihrer .bashrc-Datei den Befehl hinzu

unset command_not_found_handle

Möglicherweise möchten Sie dies am Ende Ihrer .bashrc-Datei (oder in der Nähe davon) tun, da Sie möglicherweise / etc / bashrc oder andere bash-Skripts oben in Ihrer .bashrc-Datei ausführen.

Scott C Wilson
quelle
5

Auf fedora kann dieses Verhalten durch Ändern der /etc/PackageKit/CommandNotFound.confKonfigurationsdatei gesteuert werden .

Durch die Einstellung SoftwareSourceSearch=falsewird die Verzögerung beseitigt, da mit dem Paketmanager nicht versucht wird, ein Paket mit dem fehlenden Befehl zu finden.

Sie können auch die Wartezeit für eine Paketsuche ändern, indem Sie die MaxSearchTime=2000Option ändern , um die Anzahl der Millisekunden anzugeben, die Sie warten möchten, bis die Paketsuche eine Übereinstimmung zurückgibt. Ich finde, dass der Standardwert von 2 Sekunden nicht lang genug ist, um Übereinstimmungen zurückzugeben, und nur eine unerwünschte Verzögerung verursacht, wenn Sie einen Tippfehler haben.

Erhöhen Sie entweder den Wert, MaxSearchTimeum einen nützlichen Ausgang bereitzustellen, oder deaktivieren Sie ihn SoftwareSourceSearch, um die Verzögerung insgesamt zu beseitigen.

Aner
quelle