• Aucun résultat trouvé

$ echo ’$USER #’

$USER #

$

Le deuxième permet au caractère$ de conserver sa signification :

$ echo "$USER #"

lozano #

$

Il sera souvent question de protéger les caractères spéciaux lors de l’utilisation des outils que nous présentons dans ce chapitre.

3.2 Redirections et tubes

Par défaut, tout processus a accès à trois canaux de communications (figure3.1):

Processus

Sortie Erreur Entrée

Figure3.1: Les trois flux associés à un processus

1. le flux de sortie (standard output) par défaut dirigé vers le terminal courant ; 2. le flux d’erreur (standard error) également dirigé par défaut vers le terminal

courant ;

3. le flux d’entrée (standard input) sur lequel transitent par défaut les données provenant du clavier.

Ainsi, la commande :

$ echo bonjour bonjour

$

affiche « bonjour » sur le flux standard. La commande :

$ ls amlkjg

ls: amlkj: No such file or directory

$

affiche le message sur le flux d’erreur. Et la commande (du shell bash) :

$ read A

hop l`a ←−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− saisie par l’utilisateur

$

attend la saisie d’une ligne sur le flux d’entrée, ligne qui sera stockée dans la variable A. Ce qu’il est intéressant de comprendre, c’est que la grande majorité des com-mandes et utilitaires d’unix suivent le modèle de ces trois flux standard, qu’on pourrait définir de la manière suivante :

– tout affichage est envoyé par défaut sur le flux de sortie ; – tout message d’erreur est envoyé sur le flux d’erreur ;

3

– toute donnée peut être lue depuis le flux d’entrée.

À titre d’exemple, la commande grepsuit ce modèle. Cette commande est destinée à ne récupérer que les lignes d’un fichier contenant une chaîne de caractères :

1. grep affiche le résultat sur le flux de sortie ;

2. les messages d’erreurs éventuels sont affichés sur le flux d’erreur ; 3. grep peut attendre les données à filtrer sur son flux d’entrée :

$ grep bof ←−−−−−−−−−−−−−−−−−−−−−−−−− on recherche la chaînebof xxxbofyyy Entrée ←−−−−−−−−−−−−−−−−−−−−−−− saisie par l’utilisateur xxxbofyyy ←−−−−−−−−−−−−−−−−−− correspondance :grep affiche la ligne xxxbifyyy Entrée ←−−−−−−−−−−−−−−−−−−−−−−− saisie par l’utilisateur

←−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− pas de correspondance On peut indiquer à une commande qui attend des données sur son flux d’entrée, la fin des données à l’aide du caractère EOF saisi par la combinaison de touches Ctrl

d .

Nous verrons par la suite que c’est précisément parce que la plupart des com-mandes unix suivent ce modèle des trois flux, qu’on peut composer les utilitaires avec une grande souplesse. Cette « composabilité » qui fait la grande force d’unix est possible grâce à ce qu’on appelle les redirections.

3.2.1 Redirections

Il est possible derediriger les trois flux présentés au paragraphe précédent, grâce à une syntaxe particulière qui varie très légèrement selon le shell utilisé.

Redirection du flux de sortie

On peut rediriger le flux de sortie vers un fichier :

$ echo bonjour > test.txt

$ ls -l test.txt

-rw-r--r-- 1 vincent users 8 Dec 11 16:19 test.txt

$

Le caractère > permet la redirection dans le fichiertest.txt. On peut noter que le choix du caractère évoque la direction du flux « vers » le fichier. Puis :

$ more test.txt bonjour

$

Lacommandemorequi a pour but d’afficher le contenu d’un fichier à l’écran, permet ici de comprendre que echoa réalisé son affichage dans le fichiertest.txt et non à l’écran.

Redirection du flux d’erreur

On peut dans certaines situations vouloir récupérer les informations envoyées par un programme sur le flux d’erreur. Le principe est le même que pour le flux de sortie, seul l’opérateur est différent :

$ ls qsmlkjf 2> erreur.txt

3

$ cat erreur.txt

ls: qsmlkjf: No such file or directory

$

On peut également coupler les deux redirections de la manière suivante : unprogramme > sortie.txt 2> erreur.txt

Pour rediriger les deux flux (sortie et erreur) dans un même fichier, on pourra utili-ser :

unprogramme > sortie-erreur 2>&1 Ou plus simple :

unprogramme >& sortie-erreur

Redirection en mode ajout

L’opérateur > crée ou écrase le fichier destinataire de la redirection. On peut cependant utiliser le mode « ajout » (append) pour ne pas écraser un fichier déjà existant :

$ echo bonjour > donnees.txt

$ echo salut >> donnees.txt

$ cat donnees.txt bonjour

salut

$

Redirection du flux d’entrée

Lorsqu’un programme attend des données depuis le clavier, on peut lui fournir directement ces données en utilisant le contenu d’un fichier. On dit alors qu’on redirige le flux d’entrée du programme en question. Le premier exemple que nous proposons utilise la commande bc qui est d’après la page de manuel, an arbitrary precision calculator language. Une session avec bc se présente comme suit :

$ bc -q 2+3*5 Entrée

17 quit

$

Si on stocke l’expression du calcul (2+3*5) dans un fichier, on peut indiquer à bc que les données proviennent de ce fichier :

$ cat calcul.dat 2+3*5

$ bc < calcul.dat 17

$

3

On dit qu’on a redirigé le flux d’entrée de bc depuis le fichiercalcul.dat.

Le second exemple concerne la commandemail. Pour envoyer un mail en utilisant cette commande, le principe est le suivant :

$ mail -s "Des redirections" monpote Bon ben alors...

A+

. EOT

$

l’option-s permet de spécifier le sujet. L’argument qui suit (monpote) est l’adresse électronique du destinataire du mail. Une fois la commande lancée, on peut taper le texte du message ; le caractère « . » sur une seule ligne permet de finir le texte et d’envoyer le message.

La version originelle de mail ne dispose pas de l’option -s, cette option apparaît dans le programme standardmailx. Sur le systèmeLINUX de votre serviteurmailx et mail font référence au même programme. Attention par contre, d’autres systèmes peuvent être configurés différemment.

Ce qu’il faut comprendre ici, c’est quemailattend le texte du message sur le flux d’entrée. On peut alors rediriger cette entrée « depuis » un fichier qui contiendrait le corps du message :

$ cat msg.txt ←−−−−−−−−−−−−−−−−−−−−−−− msg.txtcontient le message alors voil`a

A+

$ mail -s "redirections" monpote < msg.txt

$

Donc en supposant que l’on ait saisi le message dans le fichier msg.txt, la dernière commande mailpeut se traduire par « envoyer un mail en lisant les données depuis le fichier msg.txt. » On dit alors qu’on a redirigé le flux d’entrée.

Le trou noir

On trouve généralement sur les systèmesunixun fichier particulier dont le nom est /dev/null : c’est un « trou noir » qui absorbe toute redirection sans broncher ; ce fichier est un fichier spécial, il ne grossit pas lorsque qu’on y redirige des données.

Il peut être utile pour ne pas être dérangé par les messages d’erreur par exemple : id user > test 2> /dev/null

cette commande écrit dans le fichier test les numéros identifiant l’utilisateur user.

Si l’utilisateur n’existe pas le message d’erreur n’est pas affiché puisqu’envoyé dans /dev/null.

3.2.2 Les tubes (pipes)

Les tubes oupipesoffrent un mécanisme permettant de composer plusieurs com-mandes en connectant le flux de sortie de l’une avec le flux d’entrée de la suivante (figure 3.2).

3

P1 P2 Pn

Entrée 2 Entrée 1

Sortie 1 Sortie 2

Entrée n

Sortie n

Figure 3.2: Principe des tubes

Reprenons l’exemple de l’envoi du mail du paragraphe précédent. Supposons que nous disposions de deux fichiers de données contenant :

$ more data-I.txt machin

chose

$ et :

$ more data-II.txt bidule

chouette

$

On veut envoyer ces deux fichiers au sieur monpote. Pour ce faire :

$ cat data-I.txt data-II.txt | mail -s "some data" monpote

$

Lasortiede la commandecat— qui réalise la concaténation des données des fichiers data-I.txt et data-II.txt — est utilisée comme entrée de la commande mail (corps du message). On peut composer à l’« infini » les tubes comme le montre l’exemple suivant : on veut également envoyer une copie des données triées au gars monpote. Le tri peut être fait par la commande sort :

$ sort data-I.txt data-II.txt bidule

chose chouette machin

$

On peut donc exploiter le fait que sort peut trier les données arrivant sur le flux d’entrée, pour envoyer le mail avecdeux tubes :

$ cat data-I.txt data-II.txt | sort | mail -s "some data" monpote

$

donc ici, la sortie de cat est utilisée comme entrée pour sort qui envoie à mail le corps du message sur le flux d’entrée. Notez enfin qu’on aurait pu écrire :

$ sort data-I.txt data-II.txt | mail -s "some data" monpote

$

car sort est capable de trier les fichiers qu’on lui passe en arguments. L’exemple avait ici pour but de combiner plusieurs tubes.

Un point important à noter est que lors de l’utilisation de plusieurs commandes par l’intermédiaire de tubes, chacune des commandes est lancée en même temps par