aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Alessi <alessi@robertalessi.net>2018-09-23 14:54:55 +0200
committerRobert Alessi <alessi@robertalessi.net>2018-09-23 14:54:55 +0200
commit1545bd6317ce42fb8417767f4aa0230d31ec0389 (patch)
tree960183c2c1d2e7c2c25c844f838f9466fa95badb
parentb073ee4af2b029ae7d3167c13352199c7ccb9628 (diff)
downloadcourses-1545bd6317ce42fb8417767f4aa0230d31ec0389.tar.gz
added indices. 03-grep-bash.tex: loops (1/2)
-rw-r--r--_preamble.tex2
-rw-r--r--fichiers/01-ligne-de-commande.tex93
-rw-r--r--fichiers/03-grep-bash.tex230
3 files changed, 226 insertions, 99 deletions
diff --git a/_preamble.tex b/_preamble.tex
index 1cada26..8f02fd7 100644
--- a/_preamble.tex
+++ b/_preamble.tex
@@ -14,6 +14,8 @@
14\graphicspath{{images/}} 14\graphicspath{{images/}}
15 15
16\usepackage[french]{varioref} 16\usepackage[french]{varioref}
17\usepackage{imakeidx}
18
17\usepackage[unicode=true]{hyperref} 19\usepackage[unicode=true]{hyperref}
18\hypersetup{colorlinks,allcolors=blue,linktocpage} 20\hypersetup{colorlinks,allcolors=blue,linktocpage}
19\usepackage{hyperxmp} 21\usepackage{hyperxmp}
diff --git a/fichiers/01-ligne-de-commande.tex b/fichiers/01-ligne-de-commande.tex
index 5509a4c..5b3b6e2 100644
--- a/fichiers/01-ligne-de-commande.tex
+++ b/fichiers/01-ligne-de-commande.tex
@@ -17,6 +17,9 @@
17 breaksymbolright=\small\carriagereturn} 17 breaksymbolright=\small\carriagereturn}
18\setmintedinline{bgcolor=Lavender} 18\setmintedinline{bgcolor=Lavender}
19\usepackage{soul} 19\usepackage{soul}
20\makeindex[name=cmds, intoc, title={Liste des commandes et
21 instructions}]
22
20\begin{document} 23\begin{document}
21\maketitle 24\maketitle
22\renewcommand{\contentsname}{Sommaire} 25\renewcommand{\contentsname}{Sommaire}
@@ -55,10 +58,10 @@ Pour réaliser les mêmes opérations à la ligne de commande, il aurait
55fallu saisir les lignes suivantes: 58fallu saisir les lignes suivantes:
56\begin{enumerate} 59\begin{enumerate}
57\item création du dossier \emph{travail}:\\ 60\item création du dossier \emph{travail}:\\
58 \mintinline{text}{mkdir travail} 61 \index[cmds]{mkdir}\mintinline{text}{mkdir travail}
59\item déplacement du fichier \emph{exemple.pdf} dans le dossier 62\item déplacement du fichier \emph{exemple.pdf} dans le dossier
60 travail: \\ 63 travail: \\
61\mintinline{text}{mv exemple.pdf travail} 64 \index[cmds]{mv}\mintinline{text}{mv exemple.pdf travail}
62\end{enumerate} 65\end{enumerate}
63 66
64\paragraph{Commentaire} 67\paragraph{Commentaire}
@@ -233,7 +236,7 @@ pour le moment:
233\label{sec:prem-comm} 236\label{sec:prem-comm}
234 237
235\paragraph{pwd} 238\paragraph{pwd}
236\label{sec:pwd} 239\label{sec:pwd}\index[cmds]{pwd|textbf}
237Signifie \emph{print working directory}. Cette commande vous retourne 240Signifie \emph{print working directory}. Cette commande vous retourne
238tout simplement le chemin d'accès absolu du répertoire dans lequel 241tout simplement le chemin d'accès absolu du répertoire dans lequel
239vous vous trouvez. Très utile pour ne pas se perdre! Exemple: 242vous vous trouvez. Très utile pour ne pas se perdre! Exemple:
@@ -268,7 +271,7 @@ vous vous trouvez. Très utile pour ne pas se perdre! Exemple:
268\end{quoting} 271\end{quoting}
269 272
270\paragraph{mv} 273\paragraph{mv}
271\label{sec:mv} 274\label{sec:mv}\index[cmds]{mv|textbf}
272Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit 275Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit
273vers un autre. La syntaxe est la suivante: 276vers un autre. La syntaxe est la suivante:
274\begin{minted}[showspaces]{text} 277\begin{minted}[showspaces]{text}
@@ -298,10 +301,10 @@ Utilisation de raccourcis:
298\end{minted} 301\end{minted}
299 302
300\paragraph{cp} 303\paragraph{cp}
301\label{sec:cp} 304\label{sec:cp}\index[cmds]{cp|textbf}
302Signifie \emph{copy}. Cette commande copie des fichiers depuis un 305Signifie \emph{copy}. Cette commande copie des fichiers depuis un
303endroit vers un autre. La syntaxe est comparable à celle de la 306endroit vers un autre. La syntaxe est comparable à celle de la
304séquence \mintinline{text}{mv}. 307séquence \index[cmds]{mv}\mintinline{text}{mv}.
305\begin{minted}[showspaces]{text} 308\begin{minted}[showspaces]{text}
306cp <source> <destination> 309cp <source> <destination>
307\end{minted} 310\end{minted}
@@ -326,7 +329,7 @@ Utilisation de raccourcis:
326\end{minted} 329\end{minted}
327 330
328\paragraph{cd} 331\paragraph{cd}
329\label{sec:cd} 332\label{sec:cd}\index[cmds]{cd|textbf}
330Signifie \emph{change directory}. Permet de changer de répertoire 333Signifie \emph{change directory}. Permet de changer de répertoire
331courant, par exemple pour travailler sur les fichiers d'un répertoire 334courant, par exemple pour travailler sur les fichiers d'un répertoire
332différent de son \emph{home directory}. La syntaxe est la suivante: 335différent de son \emph{home directory}. La syntaxe est la suivante:
@@ -343,7 +346,7 @@ Exemple: changement vers le répertoire \mintinline{text}|/usr/bin|:
343 Remarquez le changement de l'invite après l'exécution de la 346 Remarquez le changement de l'invite après l'exécution de la
344 commande. L'invite nous donne l'indication du nouveau répertoire. 347 commande. L'invite nous donne l'indication du nouveau répertoire.
345\end{quoting} 348\end{quoting}
346Confirmation par la commande \mintinline{text}{pwd}: 349Confirmation par la commande \index[cmds]{pwd}\mintinline{text}{pwd}:
347\begin{minted}{text} 350\begin{minted}{text}
348[robert@kiddo /usr/bin]$ pwd 351[robert@kiddo /usr/bin]$ pwd
349/usr/bin 352/usr/bin
@@ -355,7 +358,7 @@ Confirmation par la commande \mintinline{text}{pwd}:
355\end{quoting} 358\end{quoting}
356 359
357\paragraph{ls} 360\paragraph{ls}
358\label{sec:ls} 361\label{sec:ls}\index[cmds]{ls|(textbf}
359Signifie \emph{list}. Affiche à l'écran tous les fichiers et les 362Signifie \emph{list}. Affiche à l'écran tous les fichiers et les
360répertoires contenus dans un répertoire donné. Si on ne précise pas le 363répertoires contenus dans un répertoire donné. Si on ne précise pas le
361répertoire dont il faut lister les fichiers, la commande liste les 364répertoire dont il faut lister les fichiers, la commande liste les
@@ -488,6 +491,7 @@ valeurs que celles qui sont commentées ci-dessous sont possibles.
488 dernière fois. 491 dernière fois.
489\item Le nom du fichier. 492\item Le nom du fichier.
490\end{enumerate} 493\end{enumerate}
494\index[cmds]{ls|)}
491 495
492\chapter{Bash, le shell} 496\chapter{Bash, le shell}
493\label{cha:bash-le-shell} 497\label{cha:bash-le-shell}
@@ -517,7 +521,7 @@ que l'on saura que \verb+fichier.png+ est un fichier image.
517cas de l'extension mais regarde directement à l'intérieur de chaque 521cas de l'extension mais regarde directement à l'intérieur de chaque
518fichier pour en déterminer le type. 522fichier pour en déterminer le type.
519 523
520\paragraph{file} 524\paragraph{file}\index[cmds]{file|textbf}
521La commande \mintinline{text}|file| permet de tout savoir sur les 525La commande \mintinline{text}|file| permet de tout savoir sur les
522types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt 526types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt
523Git: 527Git:
@@ -607,9 +611,9 @@ possibles:
607Tout fichier dont le nom commence par un point (\mintinline{text}|.|) 611Tout fichier dont le nom commence par un point (\mintinline{text}|.|)
608est considéré comme un fichier caché. Le plus souvent, les fichiers 612est considéré comme un fichier caché. Le plus souvent, les fichiers
609cachés contiennent des paramètres de configuration. La commande 613cachés contiennent des paramètres de configuration. La commande
610\mintinline{text}|ls| est capable de les afficher si on lui passe 614\index[cmds]{ls}\mintinline{text}|ls| est capable de les afficher si
611l'option \mintinline{text}|-a| pour \emph{all}. Appliquons cette 615on lui passe l'option \mintinline{text}|-a| pour
612option sur notre dépôt Git: 616\emph{all}. Appliquons cette option sur notre dépôt Git:
613\begin{minted}[escapeinside=||,linenos]{text} 617\begin{minted}[escapeinside=||,linenos]{text}
614[robert@kiddo courses]$ ls -la 618[robert@kiddo courses]$ ls -la
615total 72 619total 72
@@ -635,7 +639,7 @@ ligne~7 un fichier caché.
635Ces commandes s'ajoutent à celles qui sont décrites plus haut 639Ces commandes s'ajoutent à celles qui sont décrites plus haut
636(\vref{sec:prem-comm}). 640(\vref{sec:prem-comm}).
637 641
638\paragraph{mkdir} 642\paragraph{mkdir}\index[cmds]{mkdir|textbf}
639Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p| 643Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p|
640peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou 644peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou
641plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour 645plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour
@@ -647,18 +651,19 @@ mkdir: création du répertoire 'sandbox'
647mkdir: création du répertoire 'sandbox/robert' 651mkdir: création du répertoire 'sandbox/robert'
648\end{minted} 652\end{minted}
649 653
650\paragraph{touch} 654\paragraph{touch}\index[cmds]{touch|textbf}
651Sert à créer un fichier vide dont le nom est passé en argument. Cette 655Sert à créer un fichier vide dont le nom est passé en argument. Cette
652commande sert également à modifier les métadonnées de temps associées 656commande sert également à modifier les métadonnées de temps associées
653aux fichiers (date de création et/ou de modification). 657aux fichiers (date de création et/ou de modification).
654 658
655L'exemple suivant montre comment créer un nouveau dossier dans lequel 659L'exemple suivant montre comment créer un nouveau dossier dans lequel
656on crée également un fichier vide \verb|fichier.txt|. Ensuite, on 660on crée également un fichier vide \verb|fichier.txt|. Ensuite, on
657utilise la commande \verb|mv| pour \emph{déplacer} ce fichier vers un 661utilise la commande \index[cmds]{mv}\verb|mv| pour \emph{déplacer} ce
658autre fichier \verb|fichier-mk2.txt| au même endroit. Le résultat de 662fichier vers un autre fichier \verb|fichier-mk2.txt| au même
659cette action particulière, le \emph{déplacement au même endroit}, est 663endroit. Le résultat de cette action particulière, le
660tout simplement de renommer le fichier. Enfin, la commande % 664\emph{déplacement au même endroit}, est tout simplement de renommer le
661\verb|ls -l| sert de moyen de contrôle: 665fichier. Enfin, la commande %
666\index[cmds]{ls}\verb|ls -l| sert de moyen de contrôle:
662\begin{minted}{text} 667\begin{minted}{text}
663[robert@kiddo courses]$ mkdir -pv sandbox 668[robert@kiddo courses]$ mkdir -pv sandbox
664mkdir: création du répertoire 'sandbox' 669mkdir: création du répertoire 'sandbox'
@@ -672,7 +677,7 @@ total 0
672\subsection{Commandes destructives} 677\subsection{Commandes destructives}
673\label{sec:comm-destr} 678\label{sec:comm-destr}
674 679
675\paragraph{rm} 680\paragraph{rm}\index[cmds]{rm|textbf}
676Pour \emph{remove}. Il suffit de passer en argument à cette commande 681Pour \emph{remove}. Il suffit de passer en argument à cette commande
677ce que l'on souhaite détruire. Par défaut, cette commande ne détruit 682ce que l'on souhaite détruire. Par défaut, cette commande ne détruit
678pas les répertoires. Elle accepte une série d'options dont voici les 683pas les répertoires. Elle accepte une série d'options dont voici les
@@ -745,11 +750,12 @@ les commandes renvoient vers un fichier à l'aide des \emph{opérateurs
745 en argument à la commande qui précède pour traitement. 750 en argument à la commande qui précède pour traitement.
746\end{enumerate} 751\end{enumerate}
747 752
748Dans l'exemple qui suit, on demande à la commande \verb|ls -l| de 753Dans l'exemple qui suit, on demande à la commande
749rediriger son résultat vers un fichier \verb|all-files.txt|. On 754\index[cmds]{ls}\verb|ls -l| de rediriger son résultat vers un fichier
750s'assure que ce fichier a bien été créé, puis on demande à la commande 755\verb|all-files.txt|. On s'assure que ce fichier a bien été créé, puis
751\verb|cat| d'en afficher le contenu au terminal. Les trois commandes 756on demande à la commande \index[cmds]{cat}\verb|cat| d'en afficher le
752sont entrées aux lignes 1, 2 et 4: 757contenu au terminal. Les trois commandes sont entrées aux lignes 1, 2
758et 4:
753\begin{minted}[escapeinside=||,linenos]{text} 759\begin{minted}[escapeinside=||,linenos]{text}
754[robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}| 760[robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}|
755[robert@kiddo courses]$ ls 761[robert@kiddo courses]$ ls
@@ -793,7 +799,7 @@ caractère \emph{pipe} (\verb+|+).
793Avant d'aller plus loin, étudions rapidement deux nouvelles commandes 799Avant d'aller plus loin, étudions rapidement deux nouvelles commandes
794qui servent à filtrer le contenu des fichiers. 800qui servent à filtrer le contenu des fichiers.
795 801
796\paragraph{head}\label{ref:head-tail} 802\paragraph{head}\label{ref:head-tail}\index[cmds]{head|textbf}
797\mintinline{text}|head -<num> fichier| affiche au terminal les 803\mintinline{text}|head -<num> fichier| affiche au terminal les
798\verb|<num>| premières lignes d'un fichier. Sans l'option 804\verb|<num>| premières lignes d'un fichier. Sans l'option
799\mintinline{text}|-<num>|, les 10 premières lignes sont 805\mintinline{text}|-<num>|, les 10 premières lignes sont
@@ -805,7 +811,7 @@ affichées. Exemple:
805./_preamble.tex 811./_preamble.tex
806\end{minted} 812\end{minted}
807 813
808\paragraph{tail} 814\paragraph{tail}\index[cmds]{tail|textbf}
809\mintinline{text}|tail -<num> fichier| affiche au terminal les 815\mintinline{text}|tail -<num> fichier| affiche au terminal les
810\verb|<num>| dernières lignes d'un fichier. Sans l'option 816\verb|<num>| dernières lignes d'un fichier. Sans l'option
811\mintinline{text}|-<num>|, les 10 dernières lignes sont affichées. 817\mintinline{text}|-<num>|, les 10 dernières lignes sont affichées.
@@ -823,13 +829,13 @@ dernière ligne, \emph{mais en commençant à partir de la ligne}
823 829
824Cet exemple reprend des commandes connues. Supposons que l'on veuille 830Cet exemple reprend des commandes connues. Supposons que l'on veuille
825connaître simplement le nombre de fichiers du notre dépôt Git. Nous 831connaître simplement le nombre de fichiers du notre dépôt Git. Nous
826savons produire une liste à l'aide de la commande \verb|ls -l|. Nous 832savons produire une liste à l'aide de la commande
827savons également que la commande \verb|wc -l| compte les 833\index[cmds]{ls}\verb|ls -l|. Nous savons également que la commande
828lignes. Cependant, la première ligne retournée par la commande 834\verb|wc -l| compte les lignes. Cependant, la première ligne retournée
829\verb|ls -l|, qui donne la somme des \emph{file system blocks} occupés 835par la commande \verb|ls -l|, qui donne la somme des \emph{file system
830par le contenu du répertoire, doit être exclue du compte (voir 836 blocks} occupés par le contenu du répertoire, doit être exclue du
831\emph{supra}, \vpageref{ref:file-system-blocks}). C'est ici 837compte (voir \emph{supra}, \vpageref{ref:file-system-blocks}). C'est
832qu'intervient la commande, \verb|tail|, qui retourne les dernières 838ici qu'intervient la commande, \verb|tail|, qui retourne les dernières
833lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne 839lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne
834sera ignorée: 840sera ignorée:
835\begin{minted}{text} 841\begin{minted}{text}
@@ -846,13 +852,15 @@ leur contenu.
846 852
847Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}): 853Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}):
848\begin{enumerate} 854\begin{enumerate}
849\item \verb|head| qui sélectionne les premières lignes d'un fichier. 855\item \index[cmds]{head}\verb|head| qui sélectionne les premières
850\item \verb|tail| qui sélectionne les dernières lignes d'un fichier. 856 lignes d'un fichier.
857\item \index[cmds]{tail}\verb|tail| qui sélectionne les dernières
858 lignes d'un fichier.
851\end{enumerate} 859\end{enumerate}
852 860
853On ajoutera ici les commandes suivantes: 861On ajoutera ici les commandes suivantes:
854 862
855\paragraph{cat} 863\paragraph{cat}\index[cmds]{cat|textbf}
856Affiche au terminal tout le contenu d'un fichier: 864Affiche au terminal tout le contenu d'un fichier:
857\begin{minted}{text} 865\begin{minted}{text}
858[robert@kiddo courses]$ cat ls-R 866[robert@kiddo courses]$ cat ls-R
@@ -863,7 +871,7 @@ Affiche au terminal tout le contenu d'un fichier:
863./README.tex 871./README.tex
864\end{minted} 872\end{minted}
865 873
866\paragraph{wc}\label{ref:wc} 874\paragraph{wc}\label{ref:wc}\index[cmds]{wc|textbf}
867Pour \emph{word count}. Cette commande a été utilisée plus haut une 875Pour \emph{word count}. Cette commande a été utilisée plus haut une
868fois avec l'option \verb|-l| pour compter les lignes d'un fichier 876fois avec l'option \verb|-l| pour compter les lignes d'un fichier
869(\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le 877(\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le
@@ -874,7 +882,7 @@ nombre de lignes (\verb|-l|), de mots (\verb|-w|) et de caractères
874 21 114 627 makefile 882 21 114 627 makefile
875\end{minted} 883\end{minted}
876 884
877\paragraph{cut} 885\paragraph{cut}\index[cmds]{cut|textbf}
878Permet de mettre en forme des données. Prenons l'exemple du fichier 886Permet de mettre en forme des données. Prenons l'exemple du fichier
879suivant: \\ \mintinline{text}|etudiants.txt| 887suivant: \\ \mintinline{text}|etudiants.txt|
880\begin{minted}{text} 888\begin{minted}{text}
@@ -909,7 +917,7 @@ forme de façon à placer le prénom avant le nom et avoir les adresses
909email entre crochets pointus? Comment faire aussi pour récupérer les 917email entre crochets pointus? Comment faire aussi pour récupérer les
910données dans un tableur? 918données dans un tableur?
911 919
912\paragraph{awk} 920\paragraph{awk}\index[cmds]{awk|textbf}
913Ce programme accessible à la ligne de commande permet d'effectuer ce 921Ce programme accessible à la ligne de commande permet d'effectuer ce
914travail facilement. Il sélectionne les données dans l'ordre que l'on 922travail facilement. Il sélectionne les données dans l'ordre que l'on
915souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|, 923souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|,
@@ -946,10 +954,11 @@ Hector;Pédot;<hector.pedot@ailleurs.org>
946 \end{enumerate} 954 \end{enumerate}
947\end{quoting} 955\end{quoting}
948Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt| 956Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt|
949en \verb|etudiants.csv| par la commande: 957en \verb|etudiants.csv| par la commande:\index[cmds]{mv}
950\begin{minted}{text} 958\begin{minted}{text}
951mv etudiants.txt etudiants.csv 959mv etudiants.txt etudiants.csv
952\end{minted} 960\end{minted}
953et de l'ouvrir dans LibreOffice Calc. 961et de l'ouvrir dans LibreOffice Calc.
954 962
963\printindex[cmds]
955\end{document} 964\end{document}
diff --git a/fichiers/03-grep-bash.tex b/fichiers/03-grep-bash.tex
index 3b685e3..65f01cf 100644
--- a/fichiers/03-grep-bash.tex
+++ b/fichiers/03-grep-bash.tex
@@ -21,6 +21,9 @@
21 breaksymbolright=\small\carriagereturn} 21 breaksymbolright=\small\carriagereturn}
22\setmintedinline{bgcolor=Lavender} 22\setmintedinline{bgcolor=Lavender}
23\usepackage{soul} 23\usepackage{soul}
24\makeindex[name=cmds, intoc, title={Liste des commandes et
25 instructions}]
26
24\begin{document} 27\begin{document}
25\maketitle 28\maketitle
26\renewcommand{\contentsname}{Sommaire} 29\renewcommand{\contentsname}{Sommaire}
@@ -29,10 +32,10 @@
29\listoftables 32\listoftables
30 33
31\chapter{grep, les expressions régulières} 34\chapter{grep, les expressions régulières}
32\label{cha:grep-les-expressions} 35\label{cha:grep-les-expressions}\index[cmds]{grep}
33Les expressions régulières se rapprochent des \emph{wildcards} ou 36Les expressions régulières se rapprochent des \emph{wildcards} ou
34\enquote{métacaractères} qui ont été présentés dans 37\enquote{métacaractères} qui ont été présentés dans
35\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L709}{le 38\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L714}{le
36 cours sur la ligne de commande}. C'est une technique commune à pour 39 cours sur la ligne de commande}. C'est une technique commune à pour
37ainsi dire tous les langages de programmation qui permet de construire 40ainsi dire tous les langages de programmation qui permet de construire
38des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de 41des \enquote{modèles}, en anglais \emph{patterns}, susceptibles de
@@ -114,6 +117,7 @@ symboles suivants\footnote{Cette liste n'est pas exhaustive.}:
114\end{xltabular} 117\end{xltabular}
115 118
116\paragraph{grep, egrep} 119\paragraph{grep, egrep}
120\index[cmds]{grep|textbf}\index[cmds]{egrep|see{grep}}
117À la place de \verb|grep|, on peut saisir à la ligne de commande 121À la place de \verb|grep|, on peut saisir à la ligne de commande
118\verb|egrep| ou \verb|grep -E| pour \emph{extended regular 122\verb|egrep| ou \verb|grep -E| pour \emph{extended regular
119 expressions}. Quelle est la différence? Retenez ici simplement que 123 expressions}. Quelle est la différence? Retenez ici simplement que
@@ -144,7 +148,7 @@ d'options. Parmi ces options, retenons celles-ci:
144\end{description} 148\end{description}
145 149
146\paragraph{Exemples} 150\paragraph{Exemples}
147Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L732}{la 151Les exemples ci-dessous utilisent \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L737}{la
148 technique de la redirection}. 152 technique de la redirection}.
149\begin{minted}{text} 153\begin{minted}{text}
150[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea' 154[robert@kiddo courses]$ cat /usr/share/dict/cracklib-small | grep '\<s.*m\>' | grep 'ea'
@@ -352,7 +356,7 @@ art dans le cadre de la programmation en
352\label{sec:execution} 356\label{sec:execution}
353Il faut ici approfondir la notion de \emph{permissions} sur les 357Il faut ici approfondir la notion de \emph{permissions} sur les
354fichiers qui a été présentée dans le cours sur la 358fichiers qui a été présentée dans le cours sur la
355\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L451}{ligne 359\href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L454}{ligne
356 de commande}. Nous avons en effet étudié trois types de permissions 360 de commande}. Nous avons en effet étudié trois types de permissions
357sur les fichiers: en lecture, en écriture et en exécution. Revenons 361sur les fichiers: en lecture, en écriture et en exécution. Revenons
358sur les permissions données par défaut au script \verb|backup.sh|: 362sur les permissions données par défaut au script \verb|backup.sh|:
@@ -368,6 +372,7 @@ Soit:
368\end{itemize} 372\end{itemize}
369 373
370\paragraph{chmod} 374\paragraph{chmod}
375\index[cmds]{chmod|textbf}
371La commande qui permet de changer les droits s'appelle 376La commande qui permet de changer les droits s'appelle
372\verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que 377\verb|chmod|. Pour comprendre comment l'utiliser, il faut savoir que
373les permissions sont traduites par des valeurs numériques, à savoir: 378les permissions sont traduites par des valeurs numériques, à savoir:
@@ -402,11 +407,11 @@ où \verb|xyz| sont les trois chiffres qui représentent les permissions.
402 \begin{enumerate} 407 \begin{enumerate}
403 \item La commande \verb|chmod| a été entrée à la ligne 1. 408 \item La commande \verb|chmod| a été entrée à la ligne 1.
404 \item À la ligne 2, nous avons lancé la commande 409 \item À la ligne 2, nous avons lancé la commande
405 \mintinline{text}|ls -l --color| sur le fichier \verb|backup.sh|: 410 \index[cmds]{ls}\mintinline{text}|ls -l --color| sur le fichier
406 les droits listés à la ligne 3 montrent bien que la valeur 411 \verb|backup.sh|: les droits listés à la ligne 3 montrent bien que
407 \verb|x| a été ajoutée aux trois endroits possibles. On voit enfin 412 la valeur \verb|x| a été ajoutée aux trois endroits possibles. On
408 que l'option \verb|--color| affiche en vert les fichiers qui sont 413 voit enfin que l'option \verb|--color| affiche en vert les
409 exécutables. 414 fichiers qui sont exécutables.
410 \end{enumerate} 415 \end{enumerate}
411\end{quoting} 416\end{quoting}
412 417
@@ -448,8 +453,9 @@ _preamble_bbl.tex _preamble-ed.tex _preamble.tex README.tex
448\begin{quoting} 453\begin{quoting}
449 \textbf{Commentaire:} 454 \textbf{Commentaire:}
450 \begin{itemize} 455 \begin{itemize}
451 \item lignes 1--11: la commande \verb|ls -l --color| donne l'état du 456 \item lignes 1--11: la commande \index[cmds]{ls}\verb|ls -l --color|
452 dossier \emph{avant} l'exécution du script \verb|backup.sh|; 457 donne l'état du dossier \emph{avant} l'exécution du script
458 \verb|backup.sh|;
453 \item lignes 12--17: exécution du script et messages du terminal; 459 \item lignes 12--17: exécution du script et messages du terminal;
454 \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du 460 \item lignes 18--30: la commande \verb|ls -l --color| donne l'état du
455 dossier \emph{après} l'exécution du script \verb|backup.sh|. On 461 dossier \emph{après} l'exécution du script \verb|backup.sh|. On
@@ -481,9 +487,9 @@ caché.
481\label{sec:les-variables} 487\label{sec:les-variables}
482Les variables sont des informations temporaires qui peuvent être 488Les variables sont des informations temporaires qui peuvent être
483stockées et rappelées à tout moment. L'exemple qui suit va donner 489stockées et rappelées à tout moment. L'exemple qui suit va donner
484l'occasion d'étudier une nouvelle commande, \verb|echo|, dont le rôle 490l'occasion d'étudier une nouvelle commande,
485est justement de retourner au terminal la chaîne de caractères qu'on 491\index[cmds]{echo}\verb|echo|, dont le rôle est justement de retourner
486lui passe en argument: 492au terminal la chaîne de caractères qu'on lui passe en argument:
487\begin{minted}[linenos]{text} 493\begin{minted}[linenos]{text}
488[robert@kiddo courses]$ mysystem="Linux" 494[robert@kiddo courses]$ mysystem="Linux"
489[robert@kiddo courses]$ echo 'Mon système est $mysystem.' 495[robert@kiddo courses]$ echo 'Mon système est $mysystem.'
@@ -503,7 +509,7 @@ Mon système est Linux.
503 \end{description} 509 \end{description}
504 \begin{mdframed}[backgroundcolor=Cyan] 510 \begin{mdframed}[backgroundcolor=Cyan]
505 Observez la différence dans l'usage des guillemets! 511 Observez la différence dans l'usage des guillemets!
506 \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L554}{Comme 512 \href{https://notabug.org/ralessi/courses/src/master/fichiers/01-ligne-de-commande.tex#L558}{Comme
507 on le sait}, les guillemets servent à indiquer au \emph{shell} 513 on le sait}, les guillemets servent à indiquer au \emph{shell}
508 que les espaces ne sont pas des caractères actifs. Il y a 514 que les espaces ne sont pas des caractères actifs. Il y a
509 cependant une grande différence entre les guillemets simples et 515 cependant une grande différence entre les guillemets simples et
@@ -538,6 +544,7 @@ echo "et l'archive $backupdir.zip a été créée."
538\end{minted} 544\end{minted}
539 545
540\paragraph{read} 546\paragraph{read}
547\index[cmds]{read|textbf}
541Cette nouvelle commande est expliquée dans le commentaire qui suit: 548Cette nouvelle commande est expliquée dans le commentaire qui suit:
542\begin{quoting} 549\begin{quoting}
543 \textbf{Commentaire:} 550 \textbf{Commentaire:}
@@ -598,9 +605,10 @@ précédées du signe $=$. Exemple:
598\begin{quoting} 605\begin{quoting}
599 \textbf{Commentaire:} 606 \textbf{Commentaire:}
600 \begin{enumerate} 607 \begin{enumerate}
601 \item À la ligne~1, la commande \verb|ls| liste les fichiers, puis 608 \item À la ligne~1, la commande \index[cmds]{ls}\verb|ls| liste les
602 son résultat est interprété par \verb|wc -l| qui compte le nombre 609 fichiers, puis son résultat est interprété par
603 de fichiers retournés. 610 \index[cmds]{wc}\verb|wc -l| qui compte le nombre de fichiers
611 retournés.
604 \item La variable \verb|$nbre| contient donc ce dernier résultat. 612 \item La variable \verb|$nbre| contient donc ce dernier résultat.
605 \end{enumerate} 613 \end{enumerate}
606\end{quoting} 614\end{quoting}
@@ -662,24 +670,24 @@ fi
662 \begin{enumerate} 670 \begin{enumerate}
663 \item Observez la structure de la condition: 671 \item Observez la structure de la condition:
664 \begin{itemize} 672 \begin{itemize}
665 \item ligne 1: \mintinline{bash}|if| $\rightarrow$ \emph{si 673 \item ligne 1: \index[cmds]{if|textbf}\mintinline{bash}|if|
666 <condition>} où la condition est posée entre crochets. Dans 674 $\rightarrow$ \emph{si <condition>} où la condition est posée
667 l'expression entre les crochets, % 675 entre crochets. Dans l'expression entre les crochets, %
668 \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir| 676 \verb|-d "$backupdir"|, \verb|-d| signifie: \verb|$backupdir|
669 existe \emph{et} est un répertoire; 677 existe \emph{et} est un répertoire;
670 \item ligne 2: \mintinline{bash}|then| $\rightarrow$ \emph{alors, 678 \item ligne 2: \index[cmds]{then|textbf}\mintinline{bash}|then|
671 passez à la ligne suivante}; 679 $\rightarrow$ \emph{alors, passez à la ligne suivante};
672 \item ligne 6: \mintinline{bash}|else| $\rightarrow$ 680 \item ligne 6: \index[cmds]{else|textbf}\mintinline{bash}|else|
673 \emph{autrement, passez à la ligne suivante}; 681 $\rightarrow$ \emph{autrement, passez à la ligne suivante};
674 \item ligne 8: \mintinline{bash}|fi| $\rightarrow$ \emph{fin de la 682 \item ligne 8: \index[cmds]{fi|textbf}\mintinline{bash}|fi|
675 condition} (en fait les deux lettres de la conjonction \verb|if| 683 $\rightarrow$ \emph{fin de la condition} (en fait les deux
676 écrite à l'envers). 684 lettres de la conjonction \verb|if| écrite à l'envers).
677 \end{itemize} 685 \end{itemize}
678 \item À la ligne 5, la commande \verb|exit 1| ordonne au programme 686 \item À la ligne 5, la commande \index[cmds]{exit}\verb|exit 1|
679 de se terminer immédiatement et de renvoyer la valeur \verb|1| 687 ordonne au programme de se terminer immédiatement et de renvoyer
680 comme numéro d'état (\emph{status number}). Par convention, 688 la valeur \verb|1| comme numéro d'état (\emph{status number}). Par
681 \verb|0| est pour \emph{true} (le programme a bien été exécuté) et 689 convention, \verb|0| est pour \emph{true} (le programme a bien été
682 \verb|1| est pour \emph{false} (il y a eu une erreur). 690 exécuté) et \verb|1| est pour \emph{false} (il y a eu une erreur).
683 \end{enumerate} 691 \end{enumerate}
684\end{quoting} 692\end{quoting}
685 693
@@ -716,10 +724,11 @@ echo "et l'archive $backupdir.zip a été créée."
716Supposons que le répertoire de sauvegarde ait été supprimé mais que 724Supposons que le répertoire de sauvegarde ait été supprimé mais que
717l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le 725l'archive \verb|.zip| correspondante ne l'ait pas été. Dans ce cas, le
718script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons 726script \verb|backup.sh| l'écraserait. Pour éviter cela, nous pouvons
719utiliser dans le script l'instruction \verb|elif| qui permet de 727utiliser dans le script l'instruction
720construire des conditions en série. Littéralement, \verb|elif| est 728\index[cmds]{elif|textbf}\verb|elif| qui permet de construire des
721pour \emph{else if}, \enquote{ou autrement, si\ldots}. Voici donc ce 729conditions en série. Littéralement, \verb|elif| est pour \emph{else
722qu'il faut ajouter: 730 if}, \enquote{ou autrement, si\ldots}. Voici donc ce qu'il faut
731ajouter:
723\begin{minted}{bash} 732\begin{minted}{bash}
724elif [ -e "$backupdir".zip ] 733elif [ -e "$backupdir".zip ]
725 then 734 then
@@ -797,13 +806,15 @@ droits comme le montre la ligne~7 du \vref{lst:if-then-else}.
797\end{xltabular} 806\end{xltabular}
798 807
799\paragraph{test} 808\paragraph{test}
800À l'intérieur du script \verb|bash|, les crochets renvoient en fait à 809\index[cmds]{test|textbf} À l'intérieur du script \verb|bash|, les
801une commande par ailleurs disponible: \verb|test|. La commande 810crochets renvoient en fait à une commande par ailleurs disponible:
802\verb|test| renvoie en fait la sortie \verb|0| si le résultat est 811\verb|test|. La commande \verb|test| renvoie en fait la sortie
803\emph{vrai} et \verb|1| si le résultat est \emph{faux}. Le terminal ne 812\verb|0| si le résultat est \emph{vrai} et \verb|1| si le résultat est
804retourne pas le resultat, mais celui-ci est associé à une variable 813\emph{faux}. Le terminal ne retourne pas le resultat, mais celui-ci
814est associé à une variable
805\verb|$?| que l'on peut afficher par la commande: 815\verb|$?| que l'on peut afficher par la commande:
806\mintinline{bash}|echo $?|. En voici quelques exemples: 816\index[cmds]{echo}\mintinline{bash}|echo $?|. En voici quelques
817exemples:
807\begin{minted}[linenos]{text} 818\begin{minted}[linenos]{text}
808[robert@kiddo courses]$ ls 819[robert@kiddo courses]$ ls
809bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex 820bibliography.bib makefile _preamble-ed.tex _preamble.tex README.tex
@@ -837,8 +848,9 @@ L'indentation est une technique qui consiste à donner aux lignes de
837code différentes profondeurs de marge à gauche de façon à distinguer 848code différentes profondeurs de marge à gauche de façon à distinguer
838clairement des blocs logiques. Les lignes 7--20 du 849clairement des blocs logiques. Les lignes 7--20 du
839\vref{lst:if-then-else} en donnent un exemple. L'indentation permet de 850\vref{lst:if-then-else} en donnent un exemple. L'indentation permet de
840faire apparaître clairement ce qui dépend de l'instruction \verb|if| 851faire apparaître clairement ce qui dépend de l'instruction
841(l.~7), puis \verb|elif| (l.~12) et enfin \verb|else| (l.~18). 852\index[cmds]{if}\verb|if| (l.~7), puis \index[cmds]{elif}\verb|elif|
853(l.~12) et enfin \index[cmds]{else}\verb|else| (l.~18).
842 854
843Cette technique est commune à tous les langages informatiques et tous 855Cette technique est commune à tous les langages informatiques et tous
844les programmeurs l'utilisent. En Python, que nous étudierons plus 856les programmeurs l'utilisent. En Python, que nous étudierons plus
@@ -892,18 +904,18 @@ fi
892\end{minted} 904\end{minted}
893 905
894\subsection{case} 906\subsection{case}
895\label{sec:case} 907\label{sec:case}\index[cmds]{case|textbf}
896\verb|case| est une instruction qui permet d'exécuter différentes 908\verb|case| est une instruction qui permet d'exécuter différentes
897actions en fonction de la valeur d'une variable. Elle est intéressante 909actions en fonction de la valeur d'une variable. Elle est intéressante
898à étudier ici car elle fait appel à la fois à la notion de variable et 910à étudier ici car elle fait appel à la fois à la notion de variable et
899aux expressions régulières. La syntaxe est la suivante: 911aux expressions régulières. La syntaxe est la suivante:
900\begin{minted}[linenos,escapeinside=||]{text} 912\begin{minted}[linenos]{bash}
901case |\emph{variable}| in 913case $var in
902 |\emph{regexpr1}|) 914 expr1)
903 |\emph{commandes ...}| 915 <commandes ...>
904 ;; 916 ;;
905 |\emph{regexpr2}|) 917 expr2)
906 |\emph{commandes ...}| 918 <commandes ...>
907 ;; 919 ;;
908esac 920esac
909\end{minted} 921\end{minted}
@@ -920,7 +932,9 @@ esac
920 \end{enumerate} 932 \end{enumerate}
921\end{quoting} 933\end{quoting}
922 934
923Voici un exemple facile à comprendre: 935Le \vref{lst:case} montre un exemple facile à comprendre de cette
936technique.
937\begin{listing}[H]
924\begin{minted}[linenos]{bash} 938\begin{minted}[linenos]{bash}
925#!/bin/bash 939#!/bin/bash
926 940
@@ -939,12 +953,15 @@ case $animal in
939 ;; 953 ;;
940esac 954esac
941\end{minted} 955\end{minted}
956\caption{bash: instruction \texttt{case}}
957\label{lst:case}
958\end{listing}
942\begin{quoting} 959\begin{quoting}
943 \textbf{Commentaire:} 960 \textbf{Commentaire:}
944 \begin{enumerate} 961 \begin{enumerate}
945 \item À la ligne 4, l'utilisateur est invité à entrer une 962 \item À la ligne 4, l'utilisateur est invité à entrer une
946 réponse. L'instruction \verb|read| associe la réponse à la 963 réponse. L'instruction \index[cmds]{read}\verb|read| associe la
947 variable \verb|animal|. 964 réponse à la variable \verb|animal|.
948 \item À la ligne 6, l'instruction \verb|case| reprend la variable 965 \item À la ligne 6, l'instruction \verb|case| reprend la variable
949 qui est donc préfixée par le signe \verb|$|. 966 qui est donc préfixée par le signe \verb|$|.
950 \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le 967 \item Aux lignes 7 et 10, on permet à l'utilisateur d'entrer soit le
@@ -960,10 +977,109 @@ esac
960\begin{quoting} 977\begin{quoting}
961 \textbf{Remarque:} à la place de l'instruction \verb|case|, on 978 \textbf{Remarque:} à la place de l'instruction \verb|case|, on
962 recommande aujourd'hui d'utiliser une nouvelle instruction, 979 recommande aujourd'hui d'utiliser une nouvelle instruction,
963 \verb|switch|, dont la syntaxe, plus complexe, n'est pas étudiée 980 \index[cmds]{switch}\verb|switch|, dont la syntaxe, plus complexe,
964 ici. 981 n'est pas étudiée ici.
982\end{quoting}
983
984\section{Boucles}
985\label{sec:boucles}
986Les boucles (en anglais: \emph{loops}) servent à indiquer qu'une série
987d'instructions doit reprendre et continuer à s'exécuter aussi
988longtemps qu'une condition donnée n'est pas remplie.
989
990Prenons un exemple simple. Nous avons dans un répertoire plusieurs
991centaines d'images et que nous souhaitons convertir au format
992\verb|.png| toutes les images qui sont enregistrées au format
993\verb|.tiff|.
994
995Pour convertir une seule image, nous pouvons utiliser l'outil en ligne
996de commande \verb|convert| fourni par le programme
997\emph{imagemagick}\footnote{\url{http://www.imagemagick.org}}. Pour
998convertir une seule image, la syntaxe est la suivante:
999\begin{minted}{bash}
1000convert image.tiff image.png
1001\end{minted}
1002
1003Mais comment faire pour en convertir un grand nombre pris dans un
1004répertoire qui en compte des centaines enregistrées dans des formats
1005différents?
1006
1007\paragraph{basename}
1008\index[cmds]{basename|textbf}Avant de continuer, il faut dire un mot
1009de la commande \verb|basename| que nous allons utiliser ici. Cette
1010commande permet de dépouiller un nom de fichier de son chemin d'accès
1011et de son extension. La syntaxe est la suivante:
1012\begin{minted}[escapeinside=||]{text}
1013basename -s .|\emph{ext}| |\emph{file}|
1014\end{minted}
1015où \emph{ext} est le nom de l'extension et \emph{file} le nom du
1016fichier. Voici un exemple:
1017\begin{minted}{text}
1018[robert@kiddo fichiers]$ ls -l images/
1019total 252
1020-rw-r--r-- 1 robert robert 96404 2 juil. 18:32 02-ascii.png
1021-rw-r--r-- 1 robert robert 33951 20 juin 19:59 02-donnees1.png
1022-rw-r--r-- 1 robert robert 11503 20 juin 20:01 02-donnees2.png
1023-rw-r--r-- 1 robert robert 17450 3 juil. 17:43 02-exercice_formats.png
1024-rw-r--r-- 1 robert robert 87510 14 sept. 15:06 02-unicode.png
1025[robert@kiddo fichiers]$ basename -s .png images/*
102602-ascii
102702-donnees1
102802-donnees2
102902-exercice_formats
103002-unicode
1031\end{minted}
1032
1033\paragraph{for-do-done}
1034\index[cmds]{for|textbf}\index[cmds]{do|textbf}\index[cmds]{done|textbf}
1035La boucle que nous allons utiliser fait appel à trois instructions:
1036\begin{enumerate}
1037\item \verb|for| prend comme argument un nom qui sera ensuite traité
1038 comme une variable. Le nom de la variable est suivi de l'instruction
1039 \verb|in| et d'un nom de fichier qui contient des données séparées
1040 par des espaces ou bien d'une expression dans laquelle on a placé
1041 des \emph{wildcards}.
1042\item \verb|do| est suivi des commandes qu'il faut exécuter sur chaque
1043 élément retourné par l'instruction \verb|for| \ldots{} \verb|in|.
1044\item \verb|done| marque la fin de la boucle.
1045\end{enumerate}
1046
1047Voici maintenant le script qui assure la conversion du format
1048\verb|.tiff| vers le format \verb|.png|:
1049\begin{listing}[H]
1050\begin{minted}[linenos]{bash}
1051#!/bin/bash
1052for file in $(basename -s .tiff $(ls *.tiff))
1053 do convert "$file".tiff "$file".png
1054done
1055\end{minted}
1056\caption{bash: \texttt{for ... do ... done}}
1057\end{listing}
1058
1059\begin{quoting}
1060 \textbf{Commentaire:}
1061 \begin{enumerate}
1062 \item Comprendre ainsi le début de la ligne~2 %
1063 (\mintinline{bash}|for file in|): \enquote{pour tout \texttt{file}
1064 dans\ldots} où \verb|file| définit une variable dont la valeur
1065 pourra ensuite être rappelée par \verb|$file|. Le reste de la
1066 ligne est une \emph{double capture} (v.~\emph{supra},
1067 \vref{sec:capt-et-subst}):
1068 \begin{enumerate}
1069 \item \verb|$(ls *.tiff)| liste et retourne tous les fichiers dont
1070 l'extension est \verb|.tiff|
1071 \item \verb|$(basename -s .tiff $(ls *.tiff))| demande à
1072 \verb|basename| de dépouiller tous ces fichiers de leur
1073 extension \verb|.tiff| et retourne la liste des noms seuls.
1074 \end{enumerate}
1075 \item La variable \verb|file| est donc une liste constituée des noms
1076 de tous les fichiers \verb|.tiff| sans leur extension. La ligne~3
1077 les convertit tous les uns après les autres vers le format
1078 \verb|.png|.
1079 \end{enumerate}
965\end{quoting} 1080\end{quoting}
966 1081
967\hfill\verb|../..| à suivre 1082\hfill\verb|../..| à suivre
968 1083
1084\printindex[cmds]
969\end{document} 1085\end{document}