Grimoire-Command.es

GNU+Linux command memo

Memo_4 : flux de données

D’après l’édition 11 des travaux d’Alain Leaper, 2018-04-10
Licence GPL

1. Les cannaux standards

La plupart des utilitaires utilisent 3 canaux standards:

  • le canal d’entrée standard (stdin) numéro = 0

  • le canal de sortie standard (stdout) numéro = 1

  • le canal standard d’erreur (stderr) numéro = 2

En général, par défaut:

  • stdin est relié au clavier (keyboard)

  • stdout est relié à l’écran (display)

  • stderr est relié à l’écran (display)

La commande exec permet de créer, si nécessaire, d’autres canaux (3 à 9)
par abus de langage, on parle parfois de sortie standard pour l’écran et d’entrée standard pour le clavier. Cela ne peut qu’introduire des confusions…

1.1. Redirection du canal de sortie standard vers un fichier

$ nomCommande 1> nomFichier

Le numéro de stdout peut être omis ( > au lieu de 1> )

Exemple avec la commande echo :

$ echo bonjour
bonjour
$ echo bonjour > abcd
$ ls -l
-rw-r--r-- 1 alain alain 8 mai 26 15:45 abcd

Si le fichier cible existe déjà, son contenu est écrasé. Il est possible d’ajouter la nouvelle sortie au contenu existant avec >>

$ echo salut >> abcd
$ ls -l
-rw-r--r--  1 alain alain   14 mai 26 15:55 abcd

La taille de abcd est passée de 8 à 14 octets.

1.2. Redirection du canal standard d’erreur vers un fichier

Exemple avec une commande générant une erreur (fichier inexistant) :

$ rm efhg
rm: ne peut enlever `efgh': Aucun fichier ou répertoire de ce type
$ rm efgh 2> xyz
$ ls -l
-rw-r--r-- 1 alain alain 14 mai 26 15:55 abcd
-rw-r--r-- 1 alain alain 68 mai 26 16:12 xyz

1.3. Le "trou noir" : pseudo fichier périphérique /dev/null

$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 mai 26 14:43 /dev/null

Il permet de se débarrasser des sorties importunes :

$ rm efgh 2> /dev/null

Pas d’affichage et aucun fichier n’est créé.

1.4. Réunion des canaux standards de sortie (stdout) et d’erreur (stderr)

Exemple, ici abcd existe, mnop n’existe pas :

$ rm -v mnop abcd 2>&1 | tee ficErr (1)
rm: ne peut enlever `mnop': Aucun fichier ou répertoire de ce type
détruit `abcd'
$ cat ficErr
rm: ne peut enlever `mnop': Aucun fichier ou répertoire de ce type
détruit `abcd'
1 rm en mode verbeux (verbose)
$ $command |& grep 'something' (1)
$ $command 2>&1 | grep 'something' (2)
1 modern short form (bash, zsh…)
2 standard form
$ python3 -c "print('foo')" | grep 'foo'
foo
$ python3 -c "print('foo')" |& grep 'foo'
foo
$ python3 -c "import sys; print('bar', file=sys.stderr)" |& grep 'bar'
bar

2. Lecture de stdin, sortie sur stdout et dans un fichier avec la commande tee

$ tee <unFichier> (1)
bonjour
bonjour        (2)
tout le monde
tout le monde  (3)
$ cat <unFichier>
bonjour
tout le monde
1 Entrer "bonjour" au clavier puis Entrée
2 Entrer "tout le monde" au clavier puis Entrée
3 ctrl+d pour sortir, en général = EOF (fin de fichier)

La lecture du canal d’entrée standard (clavier par défaut) a été écrite sur le canal de sortie standard (l’écran) et dans le fichier "unFichier" :

$ tee < unFichier toto
bonjour
tout le monde
$ cat toto
bonjour
tout le monde

2.1. Redirection du canal d’entrée standard depuis un fichier

$ nomCommande 0< nomFichier

Le numéro de stdin peut être omis ( < au lieu de 0< ).

Exemple avec la commande tee :

$ tee < abcd ijkl
bonjour
salut
$ cat ijkl
bonjour
salut

La lecture du canal d’entrée standard a été redirigée depuis le fichier abcd, la sortie se fait à la fois sur le canal de sortie standard (l’écran par défaut) et le fichier ijkl.

3. La commande cat : concaténation de fichiers

Très utile, rien que pour afficher un fichier à l’écran

$ cat $nomFichier

Si le fichier est long, il est possible d’en visualiser des fragments par :

$ cat $nomFichier | more

Et utiliser la barre d’espace Espace pour voir la suite, page par page, et q pour sortir.

On peut aussi utiliser, avec le même résultat:

$ more $nomFichier

La commande less permet en plus de revenir en arrière. Les commandes vi et nano permettent en plus d’éditer le contenu du fichier !

Sans arguments, stdin est reliée au clavier (et stdout à l’écran).

$ cat  (1)
voici un texte  (2)
voici un texte  (3)
(4)
1 Touche Entrée
2 entrer des caractères… l’écho de ceux-ci les fait apparaître
3 la touche Entrée valide la ligne qui s’affiche à l’écran
4 ctrl+d insert un caractère de fin de fichier et met fin à cat

cat permet de créer un fichier en redirigeant stdout

$ cat > fichier_1
voici un texte

Entrer des caractères, puis touche Entrée, puis ctrl+d.

Avec 1 argument celui-ci se substitue à stdin, sans avoir à faire de redirection explicite (mais cat < fichier_1 donne le même résultat).

$ cat fichier_1
voici un texte

Il est possible de dupliquer un fichier :

$ cat fichier_1 > fichier_2
$ ls -l
-rw-r--r-- 1 alain alain 15 mai 27 15:38 fichier_1
-rw-r--r-- 1 alain alain 15 mai 27 15:54 fichier_2
-rw-r--r-- 1 alain alain 21 mai 27 16:01 monFichier

Avec plusieurs arguments (en nombre quelconque), il y a concaténation sur stdout

$ cat fichier_1 monFichier fichier_2 > ficTotal
$ cat ficTotal
voici un texte
fegrghhthh
rthththtr
voici un texte

4. Utilisation d’un tube (pipe) entre commandes

$ commande_1 | commande_2

Le canal de sortie standard (stdout) de la commande_1 est "branché" sur le canal d’entrée standard (stdin) de commande_2 (sans passer par un fichier intermédiaire).

4.1. La commande tee derrière un tube

Permet de sortir sur le canal de sortie standard et sur un fichier, exemple avec echo :

$ echo 'salut' |tee $autreFic
salut

Le fichier autreFic est créé, en plus de la sortie sur l’écran (stdout par défaut).

$ echo 'salut' > fichier_1 |tee fichier_2

fichier_1 et fichier_2 sont créés.

5. La commande xargs : prendre des lignes de texte sur son entrée standard pour les regrouper

Une fois regroupées, ces lignes peuvent être transmises à une commande.

xargs est très utile, utilisée en association avec find et grep.

Exemple, on se trouve dans le sources du noyau, on recherche le motif register_chrdev dans tous les fichiers en include:

$ find . -name '*.h' | xargs grep 'register_chrdev'
./linux-source-2.6.26/include/linux/fs.h:extern int register_chrdev(unsigned int, const char *,

D’autres exemples ont été donnés sur le Grimoire-Command.es : - Recherche sur le tag find

6. La commande echo et caractères spéciaux

La commande echo permet la sortie vers stdout d’une chaîne de caractères issue de stdin.

Il est conseillé d’utiliser des délimiteurs de chaînes: " " ou ' ' selon les cas.

$ echo "et voici une chaîne ..."
et voici une chaîne ...

Il est possible d’ajouter une chaîne dans un fichier existant

$ echo "en voici une autre" >> fichier_1
$ cat fichier_1
voici un texte
en voici une autre
Avec un seul chevron ( > ) on écrase tout le contenu du fichier.

L’option -n permet de supprimer le saut de ligne (fin de ligne) :

$ echo 'première chaîne' > test
$ echo -n 'deuxième chaîne' >> test
$ echo ' troisième chaîne' >> test
$ cat test
première chaîne
deuxième chaîne troisième chaîne

L’option -e permet de reconnaître les caractères spéciaux (ou méta-caractères). Ceux-ci sont précédés d’une barre obliquée inversée (anti-slash) et sont alors dit "échappés".

6.1. \a le bip d’alarme sonore

$ echo -e "fff\aggg"
fffggg (1)
$ echo -e fff\aggg (2)
fffaggg (3)
1 plus un "tutte"
2 sans " " ni ' '
3 et pas de tutte, montre l’utilité des délimiteurs

6.2. \n le saut de ligne

$ echo 'bonbons\ncaramels\neskimos' → bonbons\ncaramels\neskimos $ echo -e 'bonbons\ncaramels\neskimos' bonbons caramels eskimos

6.3. \0nnn sortie de caractères

Utile pour les autres caractères spéciaux, n pouvant aller de 0 à 7 (octal).

$ echo -e 'bonbons\0122caramels\0123eskimos'
bonbonsRcaramelsSeskimos  # 122 octal remplacé R et 123 par S

6.4. \c élimine la suite de la chaîne (y compris le caractère de fin de chaîne)

$ echo -e 'bonbons caramels\n\ceskimos' > test
$ cat test
bonbons caramels

Le \n permet ici simplement de ne pas décaler le prompt.

6.5. \b le retour arrière (backspace)

6.6. \t la tabulation

6.7. \\ affichage de \ (backslash)

7. env : permet de lister les variables d’environnement

Dans toute la liste de variables qui défile alors à l’écran, à remarquer en particulier, la variable $PATH qui donne, dans l’ordre, les répertoires où aller chercher des exécutables.

On peut visualiser son contenu par :

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:

Il est possible de le modifier, notamment en éditant le fichier : ~/.bashrc

Autres formes : printenv bash -c printenv