Cette fiche reprend les notions vues lors du CTP n°4. Vous retrouverez synthétisées sur cette page les différentes commandes utilisées, leur intérêt et comment nous avons pu les utiliser lors des manipulations sur ordinateur.

Table des matières

1. Canaux standards et redirections

<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Redirection de la sortie standard

La plupart des commandes que nous avons étudiées écrivent leur résultat sur le terminal. Par exemple ls, echo, cat,.... On dit que ces commandes écrivent sur la sortie standard (qui est connectée au terminal)

Il est possible de rediriger la sortie standard vers un fichier en utilisant le caractère >. On peut traduire cela en “insérer le résultat de sortie d’une commande à un endroit”, comme un fichier textuel. Par exemple :

$ ls ~ # affiche le contenu du répertoire personnel sur la sortie standard
$ ls ~ > list_files.txt # redirige la sortie standard vers le fichier list_files

<aside> <img src="/icons/report_red.svg" alt="/icons/report_red.svg" width="40px" /> Attention

La redirection de la sortie standard va créer le fichier list_files.txt s'il n'existe pas.

La redirection écrase le contenu d'un fichier existant. Si on veut ajouter le résultat à la fin du fichier, on utilise le caractère >>.

</aside>

En somme :

<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple

$ echo "Ou bien dans le fichier ?" > fichier.txt
$ cat fichier.txt
Ou bien dans le fichier ?
$ echo "Et moi ?" > fichier.txt
$ cat fichier.txt
Et moi ?
$ echo "Je ne veux pas vider le fichier" >> fichier.txt
$ cat fichier.txt
Et moi ?
Je ne veux pas vider le fichier

</aside>

</aside>

<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Compter des éléments dans un fichier

Pour compter des éléments dans un fichier, comme le nombre de noms répertoriés dans ce dernier par exemple, on utilise la commande wc.

Dans sa forme la plus simple lorsqu’elle est utilisée sans options, cette commande imprimera quatre colonnes :

Options Description
-l, –-lines Imprimez le nombre de lignes
-w, –-words Imprimez le nombre de mots
-m, –-chars Imprimez le nombre de caractères
-c, –-bytes Imprimez le nombre d’octets
-L, –-max-line-length Imprimez la longueur de la ligne la plus longue

<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple

Créons un fichier include_files.txt qui liste tous les fichiers du répertoire /usr/include dont le nom se termine par .h

$ ls /usr/include/*.h > include_files.txt

Comptons le nombre de fichiers .h dans le répertoire /usr/include, ce qui revient à compter le nombre de lignes du fichier include_files.txt.

$ wc -l include_files.txt
107 include_files.txt

Il y a donc 107 fichiers .h dans ce répertoire.

</aside>

</aside>

<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Redirection des erreurs standards

Nous avons la possibilité de rediriger des erreurs générées par le Shell dans des fichiers textuels. Pour cela, nous allons ajouter un chiffre avant le symbole > pour mentionner quels éléments l’on souhaite rediriger dans quels fichiers. On utilise :

<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple

Dans un répertoire dir, créons un fichier file-1.txt dont le contenu est Hello world !.

$ mkdir dir
$ touch dir/file-1.txt
$ echo "Hello world !" > dir/file-1.txt

Créons ensuite une copie de file-1.txt nommée file-2.txt et retirons toutes les permissions de lecture sur file-2.txt.

$ cp dir/file-1.txt dir/file-2.txt
$ ls dir
file-1.txt  file-2.txt
$ chmod a-r dir/file-2.txt

Puis entrons les commandes suivantes pour afficher le contenu de 3 fichiers :

$ cd dir # on change de répertoire courant pour que la commande fonctionne 
$ cat file-1.txt file-2.txt file-3.txt
Hello world !
cat: file-2.txt: Permission denied
cat: file-3.txt: No such file or directory

On obtient 3 résultats différents : la première commande a bien fonctionné (affichage du contenu), la deuxième génère une erreur de permissions (normal, puisqu’on les a retiré) et la troisième une erreur comme quoi le fichier n’existe pas (normal également).

On va désormais répartir ces résultats dans deux fichiers :

$ cat file-1.txt file-2.txt file-3.txt 1> result.txt 2> error.txt

Affichons le contenu des deux fichiers générés avec la commande précédente :

$ cat result.txt
Hello world !
$ cat error.txt
cat: file-2.txt: Permission denied
cat: file-3.txt: No such file or directory

</aside>

</aside>

<aside> <img src="/icons/thought_lightgray.svg" alt="/icons/thought_lightgray.svg" width="40px" /> Remarque

2>&1 redirige stderr (les erreurs donc) vers stdout, cela permet de mettre les erreurs et la sortie standard dans le même fichier

Le symbole & précise que 1 est la sortie standard et pas un nom de fichier

</aside>

<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Redirection de l’entrée standard

Certaines commandes lisent des informations sur le terminal. Par exemple tr, read,.... On dit que ces commandes lisent sur l'entrée standard (qui est aussi connectée au terminal).

Mais beaucoup de commandes lisent également sur le terminal si aucun nom de fichier leur est donné en argument. Par exemple cat, grep, sort,....

Il est possible de rediriger l'entrée standard d'une commande vers un fichier en utilisant le caractère <. Par exemple :

$ cat < fichier.txt

Cette commande affiche le contenu du fichier fichier.txt sur la sortie standard. On dit que le fichier fichier.txt est connecté à l'entrée standard de la commande cat.

<aside> <img src="/icons/report_red.svg" alt="/icons/report_red.svg" width="40px" /> Attention

Il faut que le fichier fichier.txt existe et qu'on ait la permission read sinon la commande cat va échouer.

</aside>

<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple

En reprenant cet exemple précédent, la commande suivante affiche uniquement le nombre de lignes du fichier (puisque l’on met en entrée le fichier en soi, et non pas le nom du fichier en argument) :

$ wc -l < include_files.txt
107

On peut donc afficher la phrase Il y a <nombre> fichiers .h dans le répertoire /usr/include directement avec la commande :

$ echo "Il y a `wc -l < include_files.txt` fichiers .h dans le répertoire /usr/include"

</aside>

</aside>

2. Les tubes

<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Tubes

Un tube (pipe en anglais) est un mécanisme qui permet de connecter la sortie standard d'une commande à l'entrée standard d'une autre commande. On utilise le caractère | pour créer un tube.

C'est-à-dire que pour

$ cmd1 | cmd2

La sortie standard de cmd1 est connectée à l'entrée standard de cmd2.

<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Exemple

Toujours en continuant sur cet exemple, mais cette fois sans avoir à passer par un fichier include_files.txt. Comment faire ? En passant par les tubes :

$ ls /usr/include/*.h | wc -l
107

Ici, on a passé en argument de la commande wc -l la liste de tous les fichiers se terminant par .h dans /usr/include par la commande ls /usr/include/*.h.

<aside> <img src="/icons/thought_lightgray.svg" alt="/icons/thought_lightgray.svg" width="40px" /> Remarque

Quelle est la différence entre cette démarche et la commande suivante ?

$ wc -l $(ls /usr/include/*.h)

Dans la commande de l’exemple, c’est le résultat en entier de ls /usr/include/*.h qui est positionné en argument de wc -l d’où la sortie contenant un seul nombre.

En revanche, dans la commande de la remarque, on vient exécuter ls /usr/include/*.h comme une sous-commande donc on va lire chaque fichier en énumérant son nombre de lignes.

</aside>

</aside>

</aside>

3. Filtres textuels

<aside> <img src="/icons/comment_blue.svg" alt="/icons/comment_blue.svg" width="40px" /> Filtres textuels

</aside>

<aside> <img src="/icons/compose_green.svg" alt="/icons/compose_green.svg" width="40px" /> Application

</aside>