Skip navigation.

devloop :: blog

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

Posts tagged with "bash"

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:

Ecoutez votre musique aléatoirement pour pas un rond (ou presque) en mode console

, , , ...

L'astuce qui suit nécessite la présence d'un logiciel lisant le fichier qu'on lui passe en argument et quitte une fois arrivé à la fin du titre.
find /repertoire/vers/votre/musique/ -name "*.mp3" -print|sort -R|xargs -0 -d"\n" mplayer

La première commande fouille dans une arborescence les fichiers mp3 présents et génére une liste en affichant le chemon complet vers les fichiers.
La seconde commande va réorganiser cette liste de façon aléatoire :smile:
La dernière commande extrait chaque nom de fichier de la liste pour le passer en argument du lecteur audio (ici mplayer)

Convertir des MPC en MP3 sous Linux

, , , ...

Logiciels nécessaires : lame, unzip, mppdec (à télécharger)

Vous venez de récupérer un album mais vous découvrez que les titres sont au format MPC que vous ne connaissez pas ?
On va voir comment convertir ces fichiers Musepack (extension .mpc) en fichiers .mp3...

D'après Wikipedia, Musepack est un codec de compression audio open-source qui offre des performances assez similaires au format Ogg.
Bien que les librairies MPC/Musepack soient open-source, ce n'est apparemment pas le cas des encoders et décodeurs de fichiers MPC, c'est pour cela que votre distribution ne vous les propose peut-être pas.

Pour commencer vous devez télécharger le binaire du décodeur disponible ici. Prenez la version liée dynamiquement.
Ensuite décompressez l'archive avec la commande "unzip mppdec-linux-libc6-1.95z2.zip" (adaptez en fonction de la version du logiciel) ou utilisez votre gestionnaire d'archives préféré (file-roller ou Ark par exemple). Vous devez bien sûr disposer de la commande unzip dans tous les cas.

Vous obtiendrez alors un binaire nommé "mppdec". Rendez le exécutable (chmod u+x mppdec en console) puis placez le dans un répertoire de votre path (/usr/bin/ ou ~/bin/ s'il existe).
Vous pouvez appeler l'exécutable sans option pour vérifier qu'il se trouve dans votre path.

Placez vous maintenant dans votre répertoire où se trouvent les fichiers mpc. Attention, une fois les fichiers convertis en mp3, les fichiers mpc et wav du répertoire seront effacés. Il est préférable que le dossier ne contienne que les fichiers à décoder.
Tappez les commandes :
for a in *.mpc; do n=`echo $a| cut -d. -f1`.wav;mppdec "$a" "$n";done
for a in *.wav; do n=`echo $a| cut -d. -f1`.mp3;lame -h "$a" "$n";done
rm *.mpc *.wav


Ca y est, vos fichiers sont convertis en mp3 :smile:
Pensez à mettre à jour vos tags ID3 après.

Et un script perl proposé par un visiteur :
#!/usr/bin/perl -w
use strict;

foreach my $file (@ARGV) {
  next if ($file !~ /\.mpc$/i);
  my $base = $file; $base =~ s/\.mpc$//i;
  #utilisation de mppdec pour decoder le .mpc et de lame pour encoder en .mp3
  system "mppdec \"$file\" - | lame --preset fast standard - \"$base.mp3\"";
  #affichage du message de fin
  print "$base.wma converti en mp3.\n";
}