I. Quelques formes des lignes de commandes. Forme simple 1. [user1@salle224-05 TP02]$ man echo NAME echo - display a line of text SYNOPSIS echo [SHORT-OPTION]... [STRING]... DESCRIPTION Echo the STRING(s) to standard output. La commande echo affiche sur la sortie standard les chaines de caracteres passees en argument[cite: 1, 2] 2. [user1@salle224-05 TP02]$ echo "Hello world!" Hello world! 3. [user1@salle224-05 TP02]$ echo "$?" 0 Le code de sortie 0 indique que la commande precedente (echo) s'est executee sans erreur[cite: 1, 2] 4. [user1@salle224-05 TP02]$ ls fi fi 5. [user1@salle224-05 TP02]$ echo "$?" 0 Le fichier fi existe, la commande ls se termine correctement avec un code de sortie egal a 0[cite: 1, 2] 6. [user1@salle224-05 TP02]$ ls -l fi -rw-r--r-- 1 user1 users 0 Sep 16 14:00 fi 7. [user1@salle224-05 TP02]$ echo "$?" 0 8. [user1@salle224-05 TP02]$ ls nofi ls: cannot access 'nofi': No such file or directory 9. [user1@salle224-05 TP02]$ echo "$?" 2 Le fichier nofi n'existe pas. Le code de sortie est different de 0 (ici 2), ce qui signale une erreur[cite: 1, 2] Pipeline Plus tard Liste 1. Le caractere ; permet d'enchainer des commandes sur une meme ligne. Le shell execute les commandes les unes apres les autres, de maniere sequentielle, quel que soit le code de sortie des commandes precedentes[cite: 1, 2] 2. [user1@salle224-05 TP02]$ ls fi ; echo "$?" fi 0 3. [user1@salle224-05 TP02]$ ls nofi ; echo "$?" ls: cannot access 'nofi': No such file or directory 2 4. [user1@salle224-05 TP02]$ ls fi && echo "Hello world!" ; echo "$?" fi Hello world! 0 5. [user1@salle224-05 TP02]$ ls nofi && echo "Hello world!" ; echo "$?" ls: cannot access 'nofi': No such file or directory 2 6. [user1@salle224-05 TP02]$ ls fi || echo "Hello world!" ; echo "$?" fi 0 7. [user1@salle224-05 TP02]$ ls nofi || echo "Hello world!" ; echo "$?" ls: cannot access 'nofi': No such file or directory Hello world! 0 8. [user1@salle224-05 TP02]$ ls nofi || ls fi ; echo "$?" ls: cannot access 'nofi': No such file or directory fi 0 9. [user1@salle224-05 TP02]$ ls fi || ls nofi ; echo "$?" fi 0 10. [user1@salle224-05 TP02]$ ls nofi && ls fi ; echo "$?" ls: cannot access 'nofi': No such file or directory 2 Signification des notations : - && (ET logique) : la seconde commande n'est executee que si la premiere s'est terminee avec succes (code de sortie 0)[cite: 1, 2] - || (OU logique) : la seconde commande n'est executee que si la premiere a echoue (code de sortie different de 0)[cite: 1, 2] II. Redirections des entrees/sorties. 1. [user1@salle224-05 TP02]$ ls nofi fi ls: cannot access 'nofi': No such file or directory fi 2. [user1@salle224-05 TP02]$ ls nofi fi > output_file ls: cannot access 'nofi': No such file or directory 3. [user1@salle224-05 TP02]$ cat output_file fi Le fichier output_file contient la sortie de (fi)[cite: 1]. Le message d'erreur pour nofi s'affiche sur le terminal car il est emis sur la sortie des erreurs (descripteur 2) et non redirige par '>' (qui ne redirige que la sortie standard 1)[cite: 1] 4. [user1@salle224-05 TP02]$ ls nofi > output_file ls: cannot access 'nofi': No such file or directory 5. [user1@salle224-05 TP02]$ cat output_file L'utilisation de '>' ecrase le contenu precedent du fichier[cite: 1]. Comme la commande genere aucun resultat (seulement une erreur sur le terminal), le fichier output_file se retrouve vide[cite: 1] 6. [user1@salle224-05 TP02]$ ls fifi nofifi > output_file ls: cannot access 'nofifi': No such file or directory 7. [user1@salle224-05 TP02]$ cat output_file fifi 8. [user1@salle224-05 TP02]$ ls nofi >> output_file ls: cannot access 'nofi': No such file or directory 9. [user1@salle224-05 TP02]$ cat output_file fifi Contrairement a '>' qui ecrase le fichier, '>>' permet d'ajouter a la fin du fichier sans effacer son contenu existant[cite: 1, 2]. Ici, comme ls nofi ne produit rien sur la sortie standard, le contenu reste inchange[cite: 1] 10. [user1@salle224-05 TP02]$ ls nofi fi 2> error_file fi 11. [user1@salle224-05 TP02]$ cat error_file ls: cannot access 'nofi': No such file or directory 12. [user1@salle224-05 TP02]$ ls fi nofifi 2> error_file fi 13. [user1@salle224-05 TP02]$ cat error_file ls: cannot access 'nofifi': No such file or directory 14. [user1@salle224-05 TP02]$ ls nofi fi 2>> error_file fi 15. [user1@salle224-05 TP02]$ cat error_file ls: cannot access 'nofifi': No such file or directory ls: cannot access 'nofi': No such file or directory Les redirections '2>' et '2>>' permettent de rediriger la sortie standard des erreurs (descripteur 2)[cite: 1] - '2>' ecrase le fichier cible avec les messages d'erreur[cite: 1, 2] - '2>>' ajoute les messages d'erreur a la fin du fichier sans en effacer le contenu[cite: 1, 2] 16. [user1@salle224-05 TP02]$ ls nofi fi > output_file 2> error_file 17. [user1@salle224-05 TP02]$ cat output_file fi 18. [user1@salle224-05 TP02]$ cat error_file ls: cannot access 'nofi': No such file or directory 19. [user1@salle224-05 TP02]$ ls nofi fi > output_and_error_file 2>&1 20. [user1@salle224-05 TP02]$ cat output_and_error_file ls: cannot access 'nofi': No such file or directory fi L'interet d'utiliser '2>&1' est de rediriger la sortie d'erreur (descripteur 2) vers la meme destination que la sortie standard (descripteur 1)[cite: 1] Contrairement a la commande 16 qui separait les resultats dans deux fichiers distincts (output_file et error_file), '2>&1' permet de combiner le flux de resultat et le flux d'erreur dans un seul et meme fichier[cite: 1] 21. [user1@salle224-05 TP02]$ man wc NAME wc - print newline, word, and byte counts for each file SYNOPSIS wc [OPTION]... [FILE]... DESCRIPTION Print newline, word, and byte counts for each FILE... La commande wc compte et affiche le nombre de lignes, de mots et d'octets/caracteres contenus dans un fichier ou transmis par l'entree standard[cite: 1] 22. [user1@salle224-05 TP02]$ wc ligne 1 ligne 2 CTRL-D 2 4 16 On obtient trois nombres indiquant respectivement le nombre de lignes, de mots et d'octets tapes sur l'entree standard[cite: 1]. CTRL-D signale la fin du flux d'entree (EOF)[cite: 1] 23. [user1@salle224-05 TP02]$ wc output_and_error_file 2 10 55 output_and_error_file 24. [user1@salle224-05 TP02]$ wc < output_and_error_file 2 10 55 Difference : - Dans le premier cas, le nom du fichier est passe en argument a la commande wc, qui affiche donc le nom du fichier apres les statistiques[cite: 1] - Dans le second cas, l'entree standard de wc est redirigee a partir du fichier via '<'. La commande lit le contenu depuis son entree standard et n'a pas connaissance du nom du fichier, elle n'affiche donc que les statistiques[cite: 1] 25. [user1@salle224-05 TP02]$ ls -l /etc/ > output_file On a liste les details du repertoire /etc/ et redirige le resultat pour l'enregistrer dans le fichier output_file[cite: 1, 2] 26. [user1@salle224-05 TP02]$ wc < output_file 248 2232 14850 On a compte le nombre de lignes, mots et octets contenus dans le fichier output_file en le redirigeant sur l'entree standard de wc[cite: 1] 27. [user1@salle224-05 TP02]$ ls -l /etc/ | wc 248 2232 14850 1. [user1@salle224-05 TP02]$ echo "Hello world1!" | echo "Hello world2!" Hello world2! 2. [user1@salle224-05 TP02]$ echo "Hello world1!" | cat Hello world1! 3. Signification de la notation | : Le symbole | (pipe / tube) permet de relier la sortie standard (resultats) de la commande situee a sa gauche a l'entree standard de la commande situee a sa droite[cite: 1] Explication des resultats : - Dans le premier cas (echo "Hello world1!" | echo "Hello world2!"), la commande echo de droite ignore l'entree standard qu'elle recoit et affiche simplement son propre argument "Hello world2!"[cite: 1] - Dans le deuxieme cas (echo "Hello world1!" | cat), la commande cat lit le texte recu sur son entree standard (transmis par le pipe depuis echo "Hello world1!") et l'affiche sur la sortie standard[cite: 1]