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
<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 :
>, alors on supprime le contenu du fichier et on le remplace par ce qui est indiqué avant.>>, alors on ajoute à la suite (retour à la ligne) du contenu déjà existant ce qui est indiqué avant ce symbole.<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 :
1> pour rediriger les résultats des commandes ayant fonctionné (sans erreur)2> pour rediriger les erreurs des commandes ayant échoué<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 :
result.txterror.txt$ 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>
<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>
<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>