Jouons avec Bash #1

Bash est un outil puissant mais qui peut paraître obscure au premier abord.
Dans cet article, je vais vous montrer comment Bash peut vous simplifier la vie. Après quelques généralités, nous verrons des exemples autour d’un cas concret : comment sortir quelques statistiques d’un dépôt Subversion.

D’abord, il faut savoir que Bash est un shell parmi d’autres. En effet, il en existe plusieurs sur plusieurs système d’exploitation (voir la page wikipedia). Nous allons nous concentrer sur Bash.

Il y a deux choses à savoir sur le bash : la commande man est la réponse et tout est question de flux.

La commande man permet d’avoir la page de manuel d’une commande. On peut par exemple taper « man man » ou « man bash » pour avoir des informations sur man ou sur bash. Je vous laisse rêver en parcourant ces deux pages de manuel.

Ensuite, la question de flux. Chaque commande est associée à trois flux : l’entrée standard, la sortie standard et la sortie d’erreur. Ces flux nous permettent d’interagir avec les exécutables : la sortie standard permet d’afficher le résultat normal de la commande, la sortie d’erreur permert d’afficher les messages d’erreur liés à la commande, et l’entrée standard permet d’envoyer un flux de données à l’exécutable. Hum… tout ça parait… flou ! Nous y reviendrons !

Maintenant place à l’exemple : afin de fêter notre 15 000e révision sur notre dépôt subversion, j’ai souhaité sortir quelques statistiques sur les membres de l’équipe et l’interaction qu’ils ont pu avoir avec le dépôt subversion. Je me suis donc servi de bash pour faire ça, et c’est simple ! Je vais vous montrer ce que j’ai fait et comment le reproduire sur le trunk du dépôt subversion d’Apache Tomcat.

Tout d’abord, il nous faut l’historique :

svn log http://svn.apache.org/repos/asf/tomcat/trunk/

Cette commande permet de récupérer tout l’historique du trunk.

Je trouve cette commande un peu longue, et je peux le prouver en utilisant la commande time (man time) :

time svn log http://svn.apache.org/repos/asf/tomcat/trunk/

Outre le résultat normal, on se retrouve également avec les trois lignes suivantes :

real    0m13.991s
user    0m0.147s
sys 0m0.103s

Je vous laisse consulter la page de manuel de time pour le détail du résultat. Ce que j’en déduis c’est que cette commande dure un peu plus de 13 secondes.

Comme je suis pressé, et que 13 secondes, c’est long, je vais stocker le résultat dans un fichier local. Je travaillerai par la suite sur ce fichier là :

svn log http://svn.apache.org/repos/asf/tomcat/trunk/ > tomcat.svnlog

On redirige la sortie standard de la commande svn log dans le fichier tomcat.svnlog grâce à l’opérateur « >« .

Maintenant voyons ce qu’on a dans ce fichier :

cat tomcat.svnlog

On retrouve le résultat de svn log. cat permet d’afficher le contenu d’un fichier sur la sortie standard (man cat pour plus d’infos).

Maintenant, voyons la différence avec la sortie d’erreur : svn log http://serveurquinexistepas.com/uneurl/subversion/quin/existepas/non/plus nous affiche un message d’erreur.

Redirigeons la sortie standard vers un fichier en utilisant l’opérateur « > » :

svn log http://serveurquinexistepas.com/uneurl/subversion/quin/existepas/non/plus > messagederreur.svnlog

On voit quand même le message et le fichier messagederreur.svnlog est vide (cat messagederreur.svnlog pour confirmer).

L’explication est que ce message d’erreur ne passe pas par la sortie standard, mais par la sortie d’erreur. Il faut noter que la console nous affiche les deux sorties d’une seule manière à l’écran.

Il faut plutot utiliser 2> pour rediriger cette sortie vers le fichier :

svn log http://serveurquinexistepas.com/uneurl/subversion/quin/existepas/non/plus 2> messagederreur.svnlog

On ne voit plus le message et si on cat messagederreur.svnlog, voici le résultat :

svn: E175002: Unable to connect to a repository at URL 'http://serveurquinexistepas.com/uneurl/subversion/quin/existepas/non/plus'
svn: E175002: OPTIONS de 'http://serveurquinexistepas.com/uneurl/subversion/quin/existepas/non/plus' : Could not resolve hostname `serveurquinexistepas.com': Host not found (http://serveurquinexistepas.com)

Voilà tout pour aujourd’hui. On a vu nos premières commandes, quelles sont les différences entre la sortie standard et la sortie d’erreur, et comment les rediriger vers des fichiers.

En bref :

  • man permet d’avoir la page de manuel d’une commande
  • cat permet d’afficher un fichier sur la sortie standard
  • time permet de calculer le temps d’exécution d’une commande
  • l’operateur > permet de rediriger la sortie standard vers un fichier
  • l’operateur 2> permet de rediriger la sortie d’erreur vers un fichier

Dans un prochain article, nous verrons comment fouiller dans le fichier de log.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *