Les files (pipe)

Les files (tubes, fifo, pipe, etc.) sous UNIX

Les files sont très puissantes sous UNIX et permettent de simplifier énormément le code des shells et les instructions à taper.

Les applications sont nombreuses. Les files évitent d'avoir à stocker des données temporairement dans des variables ou des fichiers.

Les files directes

|

Ce sont les files les plus courantes. Symbolisées par le |, elles permettent d'enfiler une succession de commandes, les unes après les autres sans utiliser de variables ou de fichiers intermédiaires.

cat ${fichier} | grep motif

recherche les lignes contenant motif sur le fichier ${fichier}.

ls -1 ${repertoire_source}/*.txt | xargs -i -t cp {} ${repertoire_cible}

copie les fichiers *.txt du répertoire source vers le répertoire cible.

etc.

|&

Même chose que | sauf que cette commande branche la sortie standard et la sortie erreur de la commande de gauche sur l'entrée standard de la commande de droite.

ls -R / |& more

affiche page par page la liste de tous les fichiers du système, sans que les messages d'erreur ne dérangent l'affichage.

Les files indirectes

Les files indirectes sont aussi appelées files nommées. Il s'agit de fichiers spéciaux de type p (pipe).

La file est créée avec mknod et l'option p :

mknod -p ma_file

ou bien, avec mkfifo :

mkfifo  ma_file

crée une file nommé ma_file. La commande ls -l donne :

prw-r-----   1 root   wheel         0 Jan  8 11:06 ma_file

Remarquez le type du fichier (type p, pour pipe).

Cette file est utilisable comme un fichier.

A quoi cela sert-il ?

Prenons l'exemple d'un gros fichier compressé. Supposons que nous ayons un dump de base de données à restaurer. Ce fichier, très volumineux est compressé pour prendre moins de place. Pour le traiter, il faut donc utiliser une file dans laquelle on va le décompresser avant d'envoyer le contenu vers l'import. Si le programme d'import gère mal la file, on demeure dans l'impasse. Or, la file nommée permet de manipuler une file comme un fichier. On redirige la décompression vers la file nommée come si c'était vers un fichier classique :

uncompress -c base.dmp.Z > ma_file &

qui décompresse le fichier en tâche de fond. Puis, de l'autre côté, importer le contenu de la file, par exemple, avec oracle :

imp ${user}/${password}@${base} ignore=y commit=y file=ma_file log=import.log tables=ma_table

D'autres exemples

Prenons l'exemple des fichier de log, dans le répertoire /var/log. Si l'on veut, par exemple, traiter ses fichiers pour les intégrer dans une base de données et/ou réaliser des statistiques dessus (par exemple les connexions, les sites visités, les pages les plus lues, etc.), plutôt que d'attendre que les fichiers soient découpés par newsyslog (ou autre rotatelog) afin de traiter les fichiers (avec un décalage), nous pouvons, au lieu de créer des fichiers de log, créer des files (ayant le même nom), et en sortie de ces files, récupérer le contenu et le traiter dynamiquement par des programmes ou des shells, le tout, sans avoir besoin de récupérer les fichiers, les décompresser et les traiter au fur et à mesure et en occupant, bien entendu, moins d'espace disque.