Qu'est-ce qui fait que bash se met en pause après une mauvaise commande?

23

Lorsque vous tapez une mauvaise commande, dites que vous voulez faire:

$ cd ..
$ ls

Mais au lieu de cela, vous tapez trop vite et finissez par taper entre l et s, vous obtenez donc:

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

Cela arrive tout le temps bien sûr, lorsque nous tapons vite. Ce qui m'intéresse, c'est la source de la pause de 2,5 secondes (sur mon système) après l'affichage du mauvais texte de commande à l'écran. Il me semble qu'il reconnaît instantanément la mauvaise commande, affiche un message d'erreur à ce sujet, mais juste pour le plaisir, il attend 2,5 secondes avant de me renvoyer à la ligne de commande. Qu'est-ce qui cause cela? Y a-t-il un moyen de résoudre ce problème? C'est une petite gêne, mais j'aimerais m'en débarrasser. :)

Edit: Exécution du système Fedora 16

Fuu
la source
Vous avez oublié de mentionner le système d'exploitation sur lequel vous vous trouvez.
Daniel Beck
whoa, vous ne vous alias pas de l à ls? :)
dotjoe

Réponses:

42

Ce type de comportement est dû à un outil fréquemment installé sur certaines distributions qui se connectent à bash. Ce crochet fait en sorte que si vous essayez d'exécuter une commande et que la commande n'existe pas, bash recherchera les fichiers disponibles dans les référentiels configurés et vous indiquera le package que vous devrez installer pour obtenir cette commande.

Si vous n'êtes pas sur un système Debian, vous voudrez regarder vos profils de fichiers de démarrage bash et ainsi de suite et voir si quelque chose définit la fonction nommée command_not_found_handle. Si cette fonction bash est définie, elle sera appelée chaque fois que vous exécuterez une commande et aucun programme approprié ne pourra être trouvé dans votre chemin de recherche. Si vous exécutez typset | lesset parcourez la sortie, vous verrez la command_not_found_handle()fonction si elle a été définie.

Sur Debian / Ubuntu, le package qui fournit ce comportement est introuvable en commande . Si vous purgez cela, vous désactivez les recherches, ce qui ralentit les choses.

Voici un exemple

# 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

L'heure exacte serait bien sûr différente pour vous. J'ai effectué mes tests sur un serveur assez costaud.

Zoredache
la source
10
Dans mon cas à fedora, il s'est avéré être un package appelé: PackageKit-command-not-found
Fuu
6

Une partie de la question était "y a-t-il un moyen de résoudre ce problème (dans Fedora)?" Il y a: au bas de votre fichier .bashrc ajoutez la commande

unset command_not_found_handle

Vous voudrez probablement le faire à la fin de votre .bashrc (ou à proximité) car vous exécutez peut-être / etc / bashrc ou d'autres scripts bash en haut de votre .bashrc.

Scott C Wilson
la source
5

Sur fedora, ce comportement peut être contrôlé en modifiant le /etc/PackageKit/CommandNotFound.conffichier de configuration.

Le paramètre SoftwareSourceSearch=falsesupprimera le délai car il n'essaiera pas de localiser un package avec la commande manquante à l'aide du gestionnaire de packages.

Vous pouvez également modifier la durée d'attente d'une recherche de package à la place en modifiant l' MaxSearchTime=2000option pour indiquer le nombre de millisecondes que vous êtes prêt à attendre pour que la recherche de package renvoie une correspondance. Je trouve que la valeur par défaut de 2 secondes n'est pas assez longue pour renvoyer des correspondances et provoque juste un retard indésirable lorsque vous avez une faute de frappe.

Augmentez le MaxSearchTimepour fournir une sortie utile ou désactivez-le SoftwareSourceSearchpour éliminer complètement le retard.

Aner
la source