• 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 (figure 3.1):

Processus Sortie Erreur Entrée

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

1. le flux desortie(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 shellbash) :

$ 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

$ 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 (figure 3.1):

Processus Sortie Erreur Entrée

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

1. le flux desortie(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 shellbash) :

$ 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 commandegrepsuit ce modèle. Cette commande est destinée

à ne récupérer que les lignes d’un fichier contenant unechaîne de caractèresN: 3.5 p. 77◭ 1. grepaffiche le résultat sur le flux de sortie ;

2. les messages d’erreurs éventuels sont affichés sur le flux d’erreur ; 3. greppeut 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 :grepaffiche 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èreEOFsaisi 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 unixsuivent ce modèle des trois flux, qu’on peutcomposer les utilitaires avec une grande souplesse. Cette « composabilité » qui fait la grande force d’unix est possible grâce à ce qu’on appelle lesredirections.

3.2.1 Redirections

Il est possible deredirigerles 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

$

La commandemoreNqui a pour but d’afficher le contenu d’un fichier à l’écran, § 3.3.1 p. 67◭ permet ici de comprendre queechoa 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

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

À titre d’exemple, la commandegrepsuit ce modèle. Cette commande est destinée

à ne récupérer que les lignes d’un fichier contenant unechaîne de caractèresN: 3.5 p. 77◭ 1.grepaffiche le résultat sur le flux de sortie ;

2. les messages d’erreurs éventuels sont affichés sur le flux d’erreur ; 3.greppeut 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 :grepaffiche 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èreEOFsaisi par la combinaison de touches Ctrl

d .

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

3.2.1 Redirections

Il est possible deredirigerles 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

$

Lacommande moreNqui a pour but d’afficher le contenu d’un fichier à l’écran, § 3.3.1 p. 67◭ permet ici de comprendre queechoa 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 commandebcqui est d’après la page de manuel,an arbitrary precision calculator language.Une session avecbcse 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

$ 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 commandebcqui est d’après la page de manuel,an arbitrary precision calculator language.Une session avecbcse 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 debcdepuis 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-spermet 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 demailne dispose pas de l’option-s, cette option apparaît dans le programme standardmailx. Sur le systèmeLINUXde votre serviteurmailx etmailfont 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 fichiermsg.txt, la dernière commandemailpeut se traduire par « envoyer un mail en lisant les données depuis le fichiermsg.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 huseri > test 2> /dev/null

cette commande écrit dans le fichiertestles numéros identifiant l’utilisateurhuseri.

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

On dit qu’on a redirigé le flux d’entrée debcdepuis 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-spermet 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 demailne dispose pas de l’option-s, cette option apparaît dans le programme standardmailx. Sur le systèmeLINUXde votre serviteurmailx et mailfont 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 fichiermsg.txt, la dernière commandemailpeut se traduire par « envoyer un mail en lisant les données depuis le fichiermsg.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 huseri > test 2> /dev/null

cette commande écrit dans le fichiertestles numéros identifiant l’utilisateurhuseri.

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

Figure3.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 sieurmonpote. 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 commeentré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 commandeNsort:

◮ 3.3.2 p. 67

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

chose chouette machin

$

On peut donc exploiter le fait quesortpeut 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 decatest utilisée comme entrée poursortqui envoie àmaille 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 sortest 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éeen même tempspar

3

P1 P2 Pn

Entrée 2 Entrée 1

Sortie 1 Sortie 2

Entrée n

Sortie n

Figure3.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 sieurmonpote. 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 commandemail (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 commandeNsort:

◮ 3.3.2 p. 67

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

chose chouette machin

$

On peut donc exploiter le fait quesortpeut trier les données arrivant sur le flux d’entrée, pour envoyer le mail avecdeuxtubes :

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

$

donc ici, la sortie decatest utilisée comme entrée poursortqui envoie àmaille 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

$

carsortest 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éeen même tempspar