Accélérer Bash sous openSUSE : désactiver la complétion sur les commandes inexistantes
Monday, 27. July 2009, 19:10:00
Vous avez peut-être remarqué que lorsque vous tapez une mauvaise commande sous Bash (commande inexistante, introuvable...), il se passe un temps anormalement long avant que le message "command not found" soit affiché
Par exemple si je tape "kpdp" (qui n'existe pas) ou "sar" (non-installé sur mon système), j'obtiens les temps d'attente suivant :
Ce délais d'attente est dû à la présence de scripts de complétement avancés qui s'exécutent si la commande n'a pas été trouvée.
La complétion est très utile et omniprésente sous Bash. On peut obtenir une liste des complétements effectués avec la commande suivante :
On verra par exemple "complete -u su" qui indique à Bash de proposer des noms d'utilisateurs en argument de la commande su.
On peut aussi trouver "complete -o filenames -d -X '.[^./]*' -F _exp_ bunzip2" qui indique d'appeller une fonction baptisée _exp_ définie dans le fichier /etc/profile.d/complete.bash pour générer une liste d'arguments à bunzip2 (la fonction _exp_ liste les fichiers en fonction de leur extension, les fichiers .bz2 sont renvoyés si la commande appelante est bunzip2)
Pour plus détails, aller sur la page de manuel de bash(1) et sur la section concernant complete.
Dans notre cas, ce qui pose problème c'est les lignes suivantes (ici en gras) dans le fichier /etc/bash.bashrc :
Le fichier /etc/bash_command_not_found contient une fonction qui appelle un script python qui fouille dans les bases rpm pour essayer de trouver à quel package correspond la commande tapée.
Pour empêcher cela, une solution propre est de créer un fichier vide .bash.expert dans son dossier personnel (home directory).
L'appel de commandes inexistantes est alors bien plus rapide :
PS: on peut aussi supprimer le paquet command-not-found depuis zypper ou rpm ce qui est encore mieux
Par exemple si je tape "kpdp" (qui n'existe pas) ou "sar" (non-installé sur mon système), j'obtiens les temps d'attente suivant :
> time kpdp bash: kpdp: command not found real 0m0.755s user 0m0.596s sys 0m0.096s > time sar The program 'sar' can be found in the following package: * sysstat [ path: /usr/bin/sar, repository: zypp (repo-oss) ] Try installing with: sudo zypper install sysstat bash: sar: command not found real 0m0.807s user 0m0.584s sys 0m0.112s
Ce délais d'attente est dû à la présence de scripts de complétement avancés qui s'exécutent si la commande n'a pas été trouvée.
La complétion est très utile et omniprésente sous Bash. On peut obtenir une liste des complétements effectués avec la commande suivante :
complete -p
On verra par exemple "complete -u su" qui indique à Bash de proposer des noms d'utilisateurs en argument de la commande su.
On peut aussi trouver "complete -o filenames -d -X '.[^./]*' -F _exp_ bunzip2" qui indique d'appeller une fonction baptisée _exp_ définie dans le fichier /etc/profile.d/complete.bash pour générer une liste d'arguments à bunzip2 (la fonction _exp_ liste les fichiers en fonction de leur extension, les fichiers .bz2 sont renvoyés si la commande appelante est bunzip2)
Pour plus détails, aller sur la page de manuel de bash(1) et sur la section concernant complete.
Dans notre cas, ce qui pose problème c'est les lignes suivantes (ici en gras) dans le fichier /etc/bash.bashrc :
# Expert mode: if we find $HOME/.bash.expert we skip our settings
# used for interactive completion and read in the expert file.
#
if test "$is" = "bash" -a -r $HOME/.bash.expert ; then
. $HOME/.bash.expert
elif test "$is" = "bash" ; then
# Complete builtin of the bash 2.0 and higher
case "$BASH_VERSION" in
[2-9].*)
(...)
for s in /etc/bash_completion.d/*.sh ; do
test -r $s && . $s
done
if test -f /etc/bash_command_not_found ; then
. /etc/bash_command_not_found
fi
;;
Le fichier /etc/bash_command_not_found contient une fonction qui appelle un script python qui fouille dans les bases rpm pour essayer de trouver à quel package correspond la commande tapée.
Pour empêcher cela, une solution propre est de créer un fichier vide .bash.expert dans son dossier personnel (home directory).
L'appel de commandes inexistantes est alors bien plus rapide :
> time kpdp bash: kpdp: command not found real 0m0.001s user 0m0.000s sys 0m0.004s > time sar bash: sar: command not found real 0m0.001s user 0m0.000s sys 0m0.000s
PS: on peut aussi supprimer le paquet command-not-found depuis zypper ou rpm ce qui est encore mieux







How to use Quote function: