Aller au contenu
Couillaman le site une demo bientot ! ×

Un bash aux petits oignons


dokuro
 Share

Messages recommandés

J’ai déjà abordé le fichier de configuration .bashrc qui se trouve à la racine du dossier utilisateur. J’y ai notamment ajouté du git, et de quoi utiliser nano au lieu de vi… Mais on peut y mettre vraiment plein, plein de choses pratiques. À l’image du bureau, sachez que votre bash est très configurable, on peut lui faire faire tout et n’importe quoi (sisi, c’est possible) pour gagner du temps au quotidien. Si sur un poste de travail “graphique” ça ne parait pas si utile, sur serveur, généralement administré à distance avec SSH, c’est plus que bienvenu. Voyons donc ce qu’il est possible de faire.

 

Note d’emblée : je n’ai beau évoquer principalement que Debian, car c’est la seule “autre” distribution que j’utilise vraiment en dehors de Manjaro, mais évidemment, ses dérivées (Ubuntu/Mint en tête), et en général n’importe quel “Linux” qui utilise bash comme interpréteur shell est évidemment concerné.

Les alias, un gain de temps appréciable

Premiers exemples, sur la gestion de fichiers

Les alias permettent de définir voir redéfinir des commandes. C’est notamment utile pour appliquer par défaut un comportement. Sous Debian, on en trouve déjà quelques uns qui sont commentés (pas ici, car je les utilise) :

 

 
 
Shell
 
 
# You may uncomment the following lines if you want `ls' to be colorized:

export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

Une fois n’est pas coutume, commençons par le deuxième bloc d’alias. Il faut savoir que par défaut, les commandes rm (suppression), cp (copie) et mv (déplacement/renommage) sont “directes”, notamment elles ne vous demandent pas de confirmation si un fichier existe déjà (copie et déplacement), où si c’est bien le bon fichier à “purger”. Le paramètre -i permet de passer en mode interactif, à savoir qu’il vous demandera de confirmation pour supprimer/écraser un fichier. Comme il n’est pas possible de revenir en arrière, vous poser la question juste avant de valider est un bon moyen d’éviter certains dégâts (genre un rm -r mal placé à cause d’un /en trop ?)

Concernant les modifications sur ls, deux choses à distinguer. dircolors et l’export d’LS_OPTIONS permettent d’ajouter la coloration du listing en fonction de la nature des fichiers/dossiers, et de leurs droits. C’est assez simple à comprendre, rien de transcendant. Encore qu’LS_OPTIONS va nous resservir juste après, pour les alias. Ici, non seulement on “transforme” ls pour qu’il utilise $LS_OPTIONS, mais on ajoute également deux “commandes” qui utilisent ls de manière différente :

  • ll permet d’éviter de devoir taper à chaque fois ls -l –color=auto, à savoir un affichage détaillé du contenu du dossier courant (ou celui spécifié dans la ligne de commande)
  • l permet d’ajouter les fichiers cachés, en excluant les . et .. (c’est l’option -A; l’option -a permet de les afficher aussi).

Je vais aller plus loin, car en fouillant le bashrc sur Manjaro, on trouve quelques pépites. D’abord, vous aurez probablement remarqué que les fichiers et dossiers sont affichés par ordre alphabétique, indépendamment de leur type. Mais quand vous utilisez un gestionnaire de fichiers “graphique”, les dossiers sont affichés en premier. Il est possible de retrouver ce comportement. Simplement, on modifiera la ligne définissant LS_OPTIONS pour qu’elle ressemble à ceci :

 

 
 
 
Shell
 
 
export LS_OPTIONS='--color=auto --group-directories-first'

 

L’option –group-directories-first est je pense assez explicite pour les anglophones, puisqu’elle indique à ls de regrouper (group) les dossiers (directories) en premier (first). Qui a dit que c’était compliqué Linux ? icon_biggrin.gif

Une dernière modification avant de passer à d’autres alias. Sachez qu’on peut modifier la façon dont la date s’affiche pour quelque chose de plus “explicite”. Par défaut sous Debian, vous n’avez que le mois, le jour, et l’heure :

 

 
 
 
Shell
 
 
root@master:/home# l

total 40
-rw-r--r-- 1 root root  608 janv. 11  2014 ftp.sh
drwxr-xr-x 2 root root 4096 juil. 30 00:08 kvm_games

-rw-r--r-- 1 root root 2087 févr.  3  2014 kvm_games.xml
drwxr-xr-x 4 root root 4096 juil. 29 22:42 script
drwxr-xr-x 4 root root 4096 oct.   9 04:41 vm_backup
-rwxr-xr-x 1 root root 2256 août   4 20:05 vm_backup.sh

 

Passé une certaine date vous vous asseyez sur l’heure qui est remplacée par l’année. Donc pour avoir des dates/heures complètes plus simplement, on va ajouter ça à LS_OPTIONS :

 

 
 
 
 
 
Shell
 
 
export LS_OPTIONS='--color=auto --group-directories-first --time-style=+"%d.%m.%Y %H:%M"'

 

Je vous invite à regarder la page de manuel de date pour découvrir toutes les options possibles applicables à –time-style. Sachez simplement que ça donne la date au format jour/mois/année avec l’année sur quatre chiffres, suivi de l’heure de modification au format 24h. Le résultat ?

 

 
 
 
 
Shell
 
root@master:/home# l
total 40
-rw-r--r-- 1 root root  608 11.01.2014 12:57 ftp.sh
drwxr-xr-x 2 root root 4096 30.07.2014 00:08 kvm_games
-rw-r--r-- 1 root root 2087 03.02.2014 10:32 kvm_games.xml
drwxr-xr-x 4 root root 4096 29.07.2014 22:42 script
drwxr-xr-x 4 root root 4096 09.10.2014 04:41 vm_backup
-rwxr-xr-x 1 root root 2256 04.08.2014 20:05 vm_backup.sh

 

grep, le chercheur doué

Un autre utilitaire auquel on fait très souvent appel est grep. On l’utilise d’ailleurs parfois en combinaison avec ls, parfois avec ps, parfois avec netstat… Bref, c’est un filtre qui sert très, très souvent. On va le rendre un peu plus “fancy” en lui demandant de “surligner” les résultats de recherche, comprendre qu’il va afficher en rouge le mot recherché dans les lignes qu’il renverra :

 

 
 
 
Shell
 
 
alias grep='grep --color=tty'

 

–color peut prendre plusieurs valeurs qui définiront le contexte dans lequel la couleur apparaîtra, je vous laisse consulter la page de manuel pour découvrir les options disponibles.

Un peu de diagnostic ?

Deux utilitaires permettent de rapidement savoir si le serveur a besoin d’air ou pas, à savoir df etfree. Le premier s’occupe des partitions, le deuxième de la mémoire vive. Sauf que par défaut il donne les tailles en kilooctets, ce qui est clairement peu adapté de nos jours, à l’ère des Go sur la RAM et des To pour les disques durs. On va donc redéfinir les commandes en leur adjoignant les options nécessaires :

 

 
 
 
 
Shell
 
 
alias df='df -h'                          # Tailles "humaines"
alias free='free -m'                      # Affiche en Mo

Avec -hdf adaptera l’affichage avec l’unité la plus adaptée (Mo, Go, To). free affichera désormais les quantités de RAM en Mo, plutôt qu’en ko par défaut. Un gain de temps pour les plus mauvais en calcul mental qui ne savent pas diviser par 1024 (puisqu’on travaille en binaire), et rend l’affichage plus agréable icon_biggrin.gif

Les connexions distantes

J’allais parler des alias pour les connexions SSH, mais en fait, j’en ai déjà parlé dans le billet sur la conversion des clés PuTTY.

Les commandes de mises à jour

Dernier alias, que j’utilise en différentes “saveurs” suivant la distribution que je manipule. Il est très utile car j’ai actuellement à charge ce qui correspond à six machines Debian (quatre virtuelles sur deux physiques), une CentOS, et trois Manjaro (je serais bientôt “débarrassé” de deux des Manjaro, car ce ne sont pas mes machines). Quand il s’agit de mettre à jour tout ça, comment dire… ça pique d’avoir à taper du apt-get update && apt-get upgrade (bien long), yum update (un peu plus court) et autres pacman -Syu (plus cryptique celui-là). Par chance, je n’ai pas de Gentoo sous la main, et je ne m’en porte pas plus mal, merci. Bref, j’ai donc concocté un alias “maj” qui permet d’éviter de taper de manière répétitive toutes ces commandes. Parfois plusieurs versions, choisissez celle qui vous correspond le mieux (notamment pour ceux qui comme moi, ont la mauvaise habitude de se connecter directement avec le compte root).

Sous Debian :

 

 
 
 
Shell
 
 
#Pour root

alias maj='apt-get update && apt-get upgrade'


#Pour un utilisateur standard
alias maj='sudo apt-get update && apt-get upgrade'

 

 Sous Fedora/CentOS :

 

 
 
 
Shell
 
 
alias maj='sudo yum update'

 

Sous Manjaro/arch :

 

 
 
 
 
Shell
 
 
#Pacman seul

alias maj='sudo pacman -Syu'


#en incluant les paquets AUR


alias maj='yaourt -Syua'

 

Notez que je n’appelle pas yaourt avec sudo, car il l’appelle de lui-même au besoin. Notez aussi, pour Debian, l’utilisation du &&, qui indique de ne lancer la deuxième commande que si la première a abouti avec succès. Ceci afin d’éviter de casser votre distribution, par exemple si l’un des dépôts que vous utilisez ne répond pas, qu’il évite de ne mettre à jour qu’une partie des paquets, ce qui pourrait s’avérer dangereux et/ou rendre la distribution instable.

Votre dossier de scripts perso, grâce à PATH

Avec le temps, on accumule les scripts fait maison, ou ceux qu’on a piqué sur d’autres sites. Si on est organisé, on a rangé ça dans un dossier /home/script (par exemple), mais pour les appeler, on s’arrache à chaque fois à écrire /home/script/mon_script.sh blablabla ce qui, même en abusant de la touche Tab (pour auto-compléter la frappe), reste lourd, surtout si on doit enchaîner les commandes persos.

C’est là qu’on va faire intervenir PATH$PATH quand on cherche à savoir ce qu’il y a dedans, est une variable dite globale (présente en mémoire, accessible par n’importe quel processus), qui contient les chemins vers les dossiers des exécutables. Sur une Debian, en tout cas sur celle de ma VM d’hébergement, ça correspond à ça :

 

 
 
Shell
 

seboss666@heberg-new:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

 

Les différents chemins sont séparés par “:”. L’idée est donc d’ajouter /home/script aux chemins présents dans PATH. On procède en ajoutant cette ligne à votre .bashrc :

 

 
 
 
Shell
 
 
export PATH=/home/script:$PATH

 

 Vous pouvez aussi entrer cette commande directement dans le shell, sans avoir à tout redémarrer, le résultat est immédiat. Le export est nécessaire pour rendre la variable globale (on l’exporte du script qui l’exécute/la crée/la modifie, sinon elle disparaît avec la fin du script).

Un extracteur d’archive universel ? Facile

Je n’ai même pas honte de vous partager cette “fonction” trouvée dans mon propre .bashrc sous Manjaro. Après tout, c’est utilisable aussi sous Debian et sous CentOS, alors pourquoi s’en priver ?

On pourrait coller cette routine dans un script, et utiliser l’option décrite juste au dessus. Mais là, je trouve l’astuce élégante, et permet de montrer comment peut fonctionner bash, et son fichier bashrc. Il est donc question ici non pas de définir un alias, mais carrément une fonction, qui appellera les outils adéquats en fonction du type d’archive. C’est assez basique, puisque ça se base sur l’extension du fichier, alors qu’on a vu dans l’article sur la recherche d’information que l’extension n’était pas toujours une donnée fiable. Mais ça marche quand même, et ça réduit pas mal l’écriture, alors pourquoi se priver ?

Donc voilà la fonction :

 

 
 
 
Shell
 
 
# ex - archive extractor

# usage: ex <file>

ex ()
{
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2)   tar xjf $1   ;;
      *.tar.gz)    tar xzf $1   ;;
      *.bz2)       bunzip2 $1   ;;
      *.rar)       unrar x $1     ;;
      *.gz)        gunzip $1    ;;
      *.tar)       tar xf $1    ;;

      *.tbz2)      tar xjf $1   ;;
      *.tgz)       tar xzf $1   ;;
      *.zip)       unzip $1     ;;
      *.Z)         uncompress $1;;
      *.7z)        7z x $1      ;;
      *)           echo "'$1' cannot be extracted via ex()" ;;
    esac
  else
    echo "'$1' is not a valid file"
  fi
}

 

Très simple, j’avais prévenu : on l’appelle par son petit nom avec le nom de l’archive à décompresser, et il suffit de laisser faire la magie. En fait de magie, juste un test pour vérifier qu’on lui donne bien un fichier, si c’est le cas il teste l’extension, s’il la connaît, il appelle l’outil adapté pour l’extraire, sinon il indique qu’il ne connaît pas. Si ce n’est pas un fichier “valide” (comprendre fichier standard), il n’essaie même pas d’extraire, il vous annonce que ce n’est pas ce qu’il attend.

Basique, parce qu’il n’y a pas beaucoup de gestion d’erreur là-dessus : que ce passe-t-il si on ne lui donne pas d’argument (de fichier à extraire) ? Si on lui en donne plus d’un? À moins d’une erreur sortie par les outils de décompression, même en cas d’erreur le script renvoie le code 0 (qui indique que tout s’est bien passé, alors que ce n’est pas le cas). Que se passe-t-il si l’un des outils (notamment unrar, qui n’est pas fourni par défaut dans la plupart des distributions, car non libre) est absent ? Ça pourrait vous faire un petit exercice si vous voulez en apprendre un peu plus sur la programmation de script shell. Ça pourrait aussi faire l’objet d’approfondissement qui aboutirait sur un article, pourquoi pas ? Vous avez deux heures icon_biggrin.gif

 

Conclusion

Je n’ai donné que quelques exemples “simples” de ce que le shell permet. Si j’ai ajouté le support de git (indisponible sous Debian malheureusement, à cause d’une version trop ancienne), certains ajoutent aussi des raccourics de commande git, d’autres vont jusqu’à modifier leur prompt d’une manière assez impressionnante (le prompt devenant presque un centre de notifications à lui seul). Le champ des possibles en terme de fonctionnalités peut devenir très large, jusqu’à inclure des scripts dans d’autres langages que le shell. Quand bien même, juste en shell on pourrait par exemple ajouter un mécanisme de corbeille à rm, plutôt que de supprimer directement et définitivement les fichiers/dossiers concernés (un autre exercice avec celui de l’amélioration de l’extracteur ?).

Par ailleurs, j’aborde ici la modification du bashrc de votre utilisateur habituel (qu’il soit root ou un autre). Si l’on veut que les ajouts soient accessibles à tous les utilisateurs (avec les risques que ça peut comprendre parfois), on préférera ajouter nos modifications dans le fichier /etc/bash.bashrc qui lui est global (il est d’ailleurs le premier invoqué lors du lancement de bash, vient ensuite le fichier utilisateur).

Petite note amusante de fin : la variable PATH existe aussi sous Windows, et remplit en théorie le même objectif. Seulement, elle est beaucoup moins utilisée car la souris règne en maître sur ce système. Tentez, je vous assure, ouvrez une console (tapez “cmd” dans le champ de recherche du menu démarrer, et validez), et tapez echo %PATH%. Magie, ça marche, par contre c’est encore plus moche que sous Linux !

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

 Share

×
×
  • Créer...