Skip navigation.

devloop :: blog

Blog sur la sécurité informatique, la programmation, Linux et le Web

Accélérer Bash sous openSUSE : désactiver la complétion sur les commandes inexistantes

,

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é :clown:
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 :smile:

Python : Chargement dynamique de modules - un système d'extensionsEn vrac

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies