- 1. Les cannaux standards
- 2. Lecture de stdin, sortie sur stdout et dans un fichier avec la commande
tee
- 3. La commande
cat
: concaténation de fichiers - 4. Utilisation d’un tube (pipe) entre commandes
- 5. La commande
xargs
: prendre des lignes de texte sur son entrée standard pour les regrouper - 6. La commande
echo
et caractères spéciaux - 7.
env
: permet de lister les variables d’environnement
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) |
D’autres exemples ont été donnés ici : Rediriger la sortie d’erreur en plus de la sortie standard vers la commande suivante
$ $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
…