aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Alessi <alessi@robertalessi.net>2018-09-13 19:22:23 +0200
committerRobert Alessi <alessi@robertalessi.net>2018-09-13 19:22:23 +0200
commit7744a531055d3a50d9efdca616799966b636665d (patch)
tree75135525246ebee247105d13c9443d8829b7178b
parentf0cf5408a3d04143ab3c531e1ec0e0caf7f8e4d8 (diff)
downloadcourses-7744a531055d3a50d9efdca616799966b636665d.tar.gz
fichiers/01-ligne-de-commande.tex almost complete
-rw-r--r--_preamble.tex6
-rw-r--r--fichiers/01-ligne-de-commande.tex446
2 files changed, 442 insertions, 10 deletions
diff --git a/_preamble.tex b/_preamble.tex
index 7041fd2..87c5265 100644
--- a/_preamble.tex
+++ b/_preamble.tex
@@ -2,18 +2,20 @@
2\usepackage[french]{babel} 2\usepackage[french]{babel}
3 3
4\usepackage{fontspec} 4\usepackage{fontspec}
5\setmainfont{Old Standard}
5\addtokomafont{disposition}{\rmfamily} 6\addtokomafont{disposition}{\rmfamily}
6 7
7\usepackage{csquotes} 8\usepackage{csquotes}
8\usepackage[font=footnotesize, rightmargin=0pt]{quoting} 9\usepackage[font=footnotesize, rightmargin=0pt]{quoting}
9\usepackage[svgnames]{xcolor} 10\usepackage[svgnames]{xcolor}
10 11
12\usepackage[french]{varioref}
11\usepackage{hyperref} 13\usepackage{hyperref}
12\hypersetup{unicode,colorlinks} 14\hypersetup{unicode,colorlinks,allcolors=blue,linktocpage}
13\usepackage{hyperxmp} 15\usepackage{hyperxmp}
14\usepackage{uri} 16\usepackage{uri}
15\usepackage[type={CC}, modifier={by-sa}, version ={3.0}]{doclicense} 17\usepackage[type={CC}, modifier={by-sa}, version ={3.0}]{doclicense}
16\author{Robert Alessi} 18\author{Robert Alessi}
17\lowertitleback{\footnotesize\textcopyright{} 2018 Robert Alessi 19\lowertitleback{\footnotesize\textcopyright{} 2018 Robert Alessi
18 \mailto[courses]{robert.alessi@cnrs.fr} 20 \mailto[courses]{robert.alessi@cnrs.fr}
19 \doclicenseThis} 21 \doclicenseThis} \ No newline at end of file
diff --git a/fichiers/01-ligne-de-commande.tex b/fichiers/01-ligne-de-commande.tex
index 94f7884..323ab50 100644
--- a/fichiers/01-ligne-de-commande.tex
+++ b/fichiers/01-ligne-de-commande.tex
@@ -1,6 +1,10 @@
1\input{../_preamble} 1\input{../_preamble}
2\usepackage{menukeys} 2\usepackage{menukeys}
3\title{La ligne de commande} 3\title{La ligne de commande}
4\usepackage{units}
5\usepackage{cleveref}
6\usepackage{booktabs}
7\usepackage{xltabular}
4\usepackage{dingbat} 8\usepackage{dingbat}
5\usepackage{mdframed} 9\usepackage{mdframed}
6\mdfsetup{ 10\mdfsetup{
@@ -213,13 +217,14 @@ pour le moment:
213 Ainsi, pour l'utilisateur \mintinline{text}{jacques}, 217 Ainsi, pour l'utilisateur \mintinline{text}{jacques},
214 \mintinline{text}{~/travail} est l'équivalent de \\ 218 \mintinline{text}{~/travail} est l'équivalent de \\
215 \mintinline{text}{/home/jacques/travail}. 219 \mintinline{text}{/home/jacques/travail}.
216\item répertoire parent: quel que soit le répetoire dans lequel on se 220\item \label{ref:parent-current}répertoire parent: quel que soit le
217 trouve, la séquence \mintinline{text}{..} désigne le 221 répetoire dans lequel on se trouve, la séquence
218 \emph{répertoire parent}, c'est-à-dire le répertoire qui le 222 \mintinline{text}{..} désigne le \emph{répertoire parent},
219 contient, ou bien qui est situé au niveau supérieur dans 223 c'est-à-dire le répertoire qui le contient, ou bien qui est situé au
220 l'arborescence du disque dur. Par exemple, à partir du répertoire 224 niveau supérieur dans l'arborescence du disque dur. Par exemple, à
221 \mintinline{text}{/home/jacques/travail}, \mintinline{text}{..} 225 partir du répertoire \mintinline{text}{/home/jacques/travail},
222 désigne le répertoire \mintinline{text}{/home/jacques}. 226 \mintinline{text}{..} désigne le répertoire
227 \mintinline{text}{/home/jacques}.
223\item répertoire courant: Quant au signe \og\mintinline{text}{.}\fg, 228\item répertoire courant: Quant au signe \og\mintinline{text}{.}\fg,
224 il désigne tout simplement le répertoire dans lequel on se trouve. 229 il désigne tout simplement le répertoire dans lequel on se trouve.
225\end{itemize} 230\end{itemize}
@@ -393,7 +398,7 @@ des \emph{options}. Celles-ci sont de deux types:
393Voici donc ce que donne la même commande \mintinline{text}|ls|, suivie 398Voici donc ce que donne la même commande \mintinline{text}|ls|, suivie
394de l'option \mintinline{text}|-l| pour \enquote{use a \ul{l}ong 399de l'option \mintinline{text}|-l| pour \enquote{use a \ul{l}ong
395 listing format} et de l'option \mintinline{text}|--color|: 400 listing format} et de l'option \mintinline{text}|--color|:
396\begin{minted}[escapeinside=||]{text} 401\begin{minted}[escapeinside=||,linenos]{text}
397[robert@kiddo courses]$ ls -l --color 402[robert@kiddo courses]$ ls -l --color
398total 56 403total 56
399drwxr-xr-x 3 robert robert 4096 12 sept. 21:52 |\textcolor{blue}{fichiers}| 404drwxr-xr-x 3 robert robert 4096 12 sept. 21:52 |\textcolor{blue}{fichiers}|
@@ -405,4 +410,429 @@ drwxr-xr-x 3 robert robert 4096 12 sept. 21:52 |\textcolor{blue}{fichiers}|
405-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex 410-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
406-rw-r--r-- 1 robert robert 49 12 sept. 20:57 texfiles 411-rw-r--r-- 1 robert robert 49 12 sept. 20:57 texfiles
407\end{minted} 412\end{minted}
413\begin{quoting}
414 \textbf{Remarque} L'option \mintinline{text}|--color| permet de
415 distinguer facilement les fichiers et les répertoires.
416\end{quoting}
417
418\paragraph{Commentaire}
419\label{ref:file-system-blocks}
420L'option \mintinline{text}|-l|, \enquote{long listing format}, affiche
421d'abord sur la première ligne la somme des \emph{file system blocks}
422occupés par les fichiers qui sont listés\footnote{Le \emph{file system
423 block} est la plus petite unité d'écriture possible sur un sytème
424 de fichiers donné.}. Les fichiers et les répertoires sont ensuite
425donnés dans les lignes suivantes. Prenons comme exemple la ligne~4
426ci-dessus:
427\begin{minted}{text}
428-rw-r--r-- 1 robert robert 88 12 sept. 20:57 ls-R
429\end{minted}
430Il faut l'analyser en dix parties, de la façon suivante:
431\bgroup\ttfamily
432\begin{xltabular}{1.0\linewidth}{XXXXXXXXXX}
433 \toprule
434 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \midrule\endhead
435 - & rw- & r-- & r-- & 1 & robert & robert & 88 & 12 sept. 20:57 &
436 ls-R
437 \\
438 \bottomrule
439\end{xltabular}
440\egroup
441
442Voici une analyse simplifiée de cette ligne. Retenez que d'autres
443valeurs que celles qui sont commentées ci-dessous sont possibles.
444\begin{enumerate}
445\item Peut avoir les valeurs suivantes:
446 \begin{itemize}
447 \item \mintinline{text}|-| pour les fichiers;
448 \item \mintinline{text}|d| pour les répertoires;
449 \item \mintinline{text}|l| pour les liens.
450 \end{itemize}
451\item Permissions données au propriétaire. Il y a trois types de
452 permissions que vous devez connaître ici:
453 \begin{itemize}
454 \item \mintinline{text}|-|: aucune permission;
455 \item \mintinline{text}|r|: permission en lecture;
456 \item \mintinline{text}|w|: permission en écriture;
457 \item \mintinline{text}|x|: permission en exécution.
458 \end{itemize}
459 La première position représente les droits en \emph{lecture}
460 (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|r|);
461 La deuxième position représente les droits en \emph{écriture}
462 (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|w|);
463 La troisième position représente les droits en \emph{exécution}
464 (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|x|).
465\item Permission de \emph{groupe}. Les groupes peuvent réunir
466 plusieurs utilisateurs. Par exemple, on peut créer un groupe
467 \emph{travail} et y mettre plusieurs utilisateurs qui auront ainsi
468 des permissions communes sur les fichiers et les répertoires.
469\item Permissions données à tout le monde.
470\item Le nombre de liens sur le fichier ou le répertoire listé. Un
471 fichier a en principe au moins un lien tandis qu'un répertoire en a
472 au moins deux car le système considère que le répertoire parent et
473 le répertoire courant (\mintinline{text}|..| et
474 \mintinline{text}|.|, voir \emph{supra}
475 \vref{ref:parent-current}) sont des liens.
476\item Le nom du propriétaire du fichier.
477\item Le nom du groupe dont les membres peuvent avoir des permissions
478 sur le fichier.
479\item La taille du fichier mesurée en \emph{bytes}\footnote{Le
480 \emph{byte} est une séquence de 8 \emph{bits} traitée comme une
481 seule unité d'information. Le \emph{bit} de données peut avoir deux
482 valeurs: 0 ou 1, ce nous qui rappelle que les ordinateurs sont des
483 machines électriques dans lesquelles le courant peut passer (1) ou
484 ne pas passer (0). L'unité conventionnelle du \emph{bit} est
485 \unit{b} tandis que l'unité du \emph{byte} est \unit{B}. Il ne
486 faut pas les confondre.}.
487\item La date à laquelle le fichier a été créé ou modifié pour la
488 dernière fois.
489\item Le nom du fichier.
490\end{enumerate}
491
492\chapter{Bash, le shell}
493\label{cha:bash-le-shell}
494Ce que vous montre le terminal, à savoir l'invite de commande ou
495\emph{prompt} en anglais, s'appelle le \emph{shell}. Il y a plusieurs
496types de \emph{shells}, mais le plus connu s'appelle
497\emph{bash}\footnote{Pour \emph{bourne again
498 shell}.}. La~\vref{sec:prem-comm} vous a appris une première série
499de commandes.
500
501Les commandes portent sur les \emph{fichiers}. Avant de continuer, il
502faut savoir que sous Linux \emph{tout est fichier}: un fichier texte
503est un fichier, mais un répertoire aussi, de même que le clavier,
504l'écran et tous les périphériques de l'ordinateur sont des
505fichiers. Ainsi, un programme vidéo qui joue un film ne fait pas autre
506chose que copier des séquences vidéo vers le fichier qui désigne
507l'écran et des séquences son vers le fichier qui désigne la carte
508son.
509
510La deuxième chose à savoir est que Linux est un système dit \emph{sans
511 extension}. L'\emph{extension} est une séquence de 1 à 4 caractères
512placée après un point dans un nom de fichier. Elle permet de connaître
513quel est le type de chaque fichier. Par exemple, c'est par l'extension
514que l'on saura que \verb+fichier.png+ est un fichier image.
515
516À la différence d'autres systèmes informatiques, Linux ne fait aucun
517cas de l'extension mais regarde directement à l'intérieur de chaque
518fichier pour en déterminer le type.
519
520\paragraph{file}
521La 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
523Git:
524\begin{minted}[linenos]{text}
525[robert@kiddo courses]$ file *
526fichiers: directory
527ls-R: ASCII text
528makefile: makefile script, ASCII text
529_preamble.tex: LaTeX 2e document, ASCII text
530README.md: UTF-8 Unicode text
531README.pdf: PDF document, version 1.5
532README.tex: LaTeX 2e document, UTF-8 Unicode text
533texfiles: ASCII text
534\end{minted}
535\begin{quoting}
536 \textbf{Remarques:}
537 \begin{enumerate}
538 \item Les éléments des lignes 2, 3, 4 et 9 n'ont pas d'extension
539 mais Linux détermine leur type de façon précise.
540 \item À la suite de la commande \mintinline{text}|file|, le
541 caractère \mintinline{text}|*| a une signification spéciale: il
542 désigne toute séquence formée par zéro ou plus de caractères: on
543 l'a utilisé ici pour lister tous les fichiers du répertoire
544 courant (v. \emph{infra} \vref{sec:wildcards} pour plus de
545 détails).
546 \end{enumerate}
547\end{quoting}
548
549\paragraph{Minuscules et majuscules}
550À savoir également: Linux est sensible à la casse dans les noms des
551fichiers. Ainsi, \verb+fichier.txt+ et \verb+Fichier.txt+ sont deux
552fichiers différents.
553
554\paragraph{Espaces}
555Soit la commande suivante:
556\begin{minted}{text}
557[robert@kiddo courses]$ ls -l README.md README.pdf
558-rw-r--r-- 1 robert robert 1254 13 sept. 08:14 README.md
559-rw-r--r-- 1 robert robert 27345 13 sept. 08:15 README.pdf
560\end{minted}
561Comme on l'a vu plus haut (\vref{sec:options}), le \emph{shell} n'a
562pas de mal à distinguer l'\emph{option courte} des \emph{arguments}
563car à la différence des arguments, l'option est préfixée par le signe
564\mintinline{text}|-|. La commande est donc interprétée de la façon
565suivante: \enquote{veuillez donner des informations au \emph{format
566 long} sur les deux fichiers \texttt{README.md} et
567 \texttt{README.pdf}}.
568
569C'est donc l'\emph{espace} qui sert à délimiter les options et les
570arguments dans les commandes du \emph{shell}. Techniquement, comme
571l'espace est interprété comme un délimiteur, on dit que c'est un
572\emph{caractère actif} du \emph{shell}. Ainsi, dans une ligne de
573commande, un fichier nommé \verb+photos de vacances.zip+ sera
574interprété comme une suite distincte de trois arguments:
575\begin{enumerate}
576\item \verb+photos+
577\item \verb+de+
578\item \verb+vacances.zip+
579\end{enumerate}
580Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions
581possibles:
582\begin{enumerate}
583\item Placer le nom du fichier entre guillemets simples:
584\begin{minted}{text}
585[robert@kiddo courses]$ ls 'photos de vacances.zip'
586'photos de vacances.zip'
587\end{minted}
588\item Préfixer les espaces par ce qu'on appelle l'\emph{escape
589 character} qui est le \emph{backslash} (\verb+\+)
590\begin{minted}{text}
591[robert@kiddo courses]$ ls photos\ de\ vacances.zip
592'photos de vacances.zip'
593\end{minted}
594 Le rôle du caractère d'échappement est en effet d'annuler la
595 signification particulière du caractère qui le suit. Or dans le
596 \emph{shell}, l'espace est un \emph{caractère actif} puisqu'il est
597 le délimiteur entre les commandes, les options et les arguments.
598\end{enumerate}
599\begin{quoting}
600 On comprendra qu'il vaut mieux éviter d'utiliser les espaces dans
601 les noms des fichiers. À la place des espaces, on utilisera le
602 caractère de soulignement ou \emph{underscore}:
603 \verb+photos_de_vacances.zip+
604\end{quoting}
605
606\paragraph{Fichiers cachés}
607Tout fichier dont le nom commence par un point (\mintinline{text}|.|)
608est considéré comme un fichier caché. Le plus souvent, les fichiers
609cachés contiennent des paramètres de configuration. La commande
610\mintinline{text}|ls| est capable de les afficher si on lui passe
611l'option \mintinline{text}|-a| pour \emph{all}. Appliquons cette
612option sur notre dépôt Git:
613\begin{minted}[escapeinside=||,linenos]{text}
614[robert@kiddo courses]$ ls -la
615total 72
616drwxr-xr-x 4 robert robert 4096 13 sept. 12:44 .
617drwxr-xr-x 6 robert robert 4096 10 sept. 11:04 ..
618drwxr-xr-x 3 robert robert 4096 13 sept. 12:44 |\textcolor{blue}{fichiers}|
619drwxr-xr-x 8 robert robert 4096 13 sept. 11:29 |\textcolor{blue}{.git}|
620-rw-r--r-- 1 robert robert 19 1 août 2017 .gitignore
621-rw-r--r-- 1 robert robert 88 13 sept. 08:14 ls-R
622-rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile
623-rw-r--r-- 1 robert robert 588 13 sept. 11:29 _preamble.tex
624-rw-r--r-- 1 robert robert 1254 13 sept. 08:14 README.md
625-rw-r--r-- 1 robert robert 27345 13 sept. 08:15 README.pdf
626-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
627-rw-r--r-- 1 robert robert 49 13 sept. 08:14 texfiles
628\end{minted}
629Nous voyons ainsi apparaître à la ligne~6 un répertoire caché et à la
630ligne~7 un fichier caché.
631
632\section{Commandes courantes}
633\label{sec:commandes-courantes}
634
635Ces commandes s'ajoutent à celles qui sont décrites plus haut
636(\vref{sec:prem-comm}).
637
638\paragraph{mkdir}
639Sert à 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
641plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour
642\emph{verbose}, demande aussi à \verb|mkdir| de retourner un message
643de confirmation:
644\begin{minted}{text}
645[robert@kiddo courses]$ mkdir -pv sandbox/robert
646mkdir: création du répertoire 'sandbox'
647mkdir: création du répertoire 'sandbox/robert'
648\end{minted}
649
650\paragraph{touch}
651Sert à 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
653aux fichiers (date de création et/ou de modification).
654
655L'exemple suivant montre comment créer un nouveau dossier dans lequel
656on crée également un fichier vide \verb|fichier.txt|. Ensuite, on
657utilise la commande \verb|mv| pour \emph{déplacer} ce fichier vers un
658autre fichier \verb|fichier-mk2.txt| au même endroit. Le résultat de
659cette action particulière, le \emph{déplacement au même endroit}, est
660tout simplement de renommer le fichier. Enfin, la commande %
661\verb|ls -l| sert de moyen de contrôle:
662\begin{minted}{text}
663[robert@kiddo courses]$ mkdir -pv sandbox
664mkdir: création du répertoire 'sandbox'
665[robert@kiddo courses]$ touch sandbox/fichier.txt
666[robert@kiddo courses]$ mv sandbox/fichier.txt sandbox/fichier-mk2.txt
667[robert@kiddo courses]$ ls -l sandbox/
668total 0
669-rw-r--r-- 1 robert robert 0 13 sept. 15:51 fichier-mk2.txt
670\end{minted}
671
672\subsection{Commandes destructives}
673\label{sec:comm-destr}
674
675\paragraph{rm}
676Pour \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
678pas les répertoires. Elle accepte une série d'options dont voici les
679plus importantes:
680\begin{description}
681\item[-i] demande une confirmation à chaque opération de destruction.
682\item[-f] pour \emph{force}; fait le contraire de \verb|-i|.
683\item[-r] pour \emph{recursive}; détruit les répertoires et leur
684 contenu.
685\end{description}
686
687\begin{mdframed}[backgroundcolor=Cyan]
688Cette commande doit être exécutée avec précaution car il n'y a aucun
689retour en arrière possible.
690\end{mdframed}
691
692Par exemple, soit le répertoire \verb|sandbox|. La commande:
693\begin{minted}{text}
694[robert@kiddo courses]$ rm -rf sandbox
695\end{minted}
696détruira sans aucune demande de confirmation à la fois le répertoire
697\verb|sandbox| et tout ce qu'il contient, fichiers, répertoires et
698sous-répertoires.
699
700Pour donner une idée de la puissance de destruction de cette commande,
701la ligne suivante:
702\begin{minted}{text}
703[robert@kiddo courses]$ rm -rf *
704\end{minted}
705détruira absolument tout sans demande de confirmation pour ne laisser
706que les fichiers cachés du répertoire courant dont le nom commence
707par un point.
708
709\subsection{Wildcards}
710\label{sec:wildcards}
711Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères
712ou des séquences de caractères qui servent à représenter des séries de
713caractères. On les utilise pour construire des schémas de
714remplacement. Voici quels sont les plus utilisés:
715\begin{itemize}
716\item \verb|*| représente zéro ou plus de caractères.
717\item \verb|?| représente un caractère unique.
718\item \verb|[]| représente une série de caractères. Par exemple,
719 \verb|[QGH]| représente l'une des trois lettres majuscules Q, G ou
720 H. Ainsi, la commande:
721\begin{minted}{text}
722ls [QGH]*
723\end{minted}
724 retournera tous les noms de fichiers qui commencent par l'une de ces
725 trois lettres. Pour représenter une \emph{série continue de
726 caractères}, on peut utiliser le trait d'union. Par exemple,
727 \verb|[a-z]| représente toutes les lettres minuscules non accentuées
728 de l'alphabet; et \verb|[A-Za-z]| toutes les lettres non accentuées,
729 majuscules ou minuscules.
730\end{itemize}
731
732\subsection{Redirection et chaînage}
733\label{sec:redir-et-chain}
734Nous avons vu jusqu'ici que les commandes renvoient normalement leur
735résultat sur le terminal lui-même. On peut cependant rediriger ce que
736les commandes renvoient vers un fichier à l'aide des \emph{opérateurs
737 de redirection}. Trois d'entre eux sont utiles à connaître:
738\begin{enumerate}
739\item \verb|>| redirige vers un nouveau fichier. Si le fichier
740 n'existe pas, il est créé. S'il existe, il sera écrasé et remplacé
741 par un nouveau fichier du même nom.
742\item \verb|>>| fait la même chose que \verb|>|, mais \emph{ajoute} le
743 résultat au fichier si celui-ci existe.
744\item \verb|<| lit le contenu du fichier dont le nom suit et le passe
745 en argument à la commande qui précède pour traitement.
746\end{enumerate}
747
748Dans l'exemple qui suit, on demande à la commande \verb|ls -l| de
749rediriger son résultat vers un fichier \verb|all-files.txt|. On
750s'assure que ce fichier a bien été créé, puis on demande à la commande
751\verb|cat| d'en afficher le contenu au terminal. Les trois commandes
752sont entrées aux lignes 1, 2 et 4:
753\begin{minted}[escapeinside=||,linenos]{text}
754[robert@kiddo courses]$ ls -l > |\textcolor{blue}{all-files.txt}|
755[robert@kiddo courses]$ ls
756|\textcolor{blue}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex
757[robert@kiddo courses]$ cat |\textcolor{blue}{all-files.txt}|
758total 24
759drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers
760-rw-r--r-- 1 robert robert 88 13 sept. 13:34 ls-R
761-rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile
762-rw-r--r-- 1 robert robert 668 13 sept. 15:26 _preamble.tex
763-rw-r--r-- 1 robert robert 1254 13 sept. 13:34 README.md
764-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
765\end{minted}
766
767L'exemple suivant est plus subtil. Il fait appel à une commande,
768\verb|wc -l| qui compte les lignes des fichiers:
769\begin{minted}[linenos]{text}
770[robert@kiddo courses]$ wc -l makefile
77121 makefile
772[robert@kiddo courses]$ wc -l < makefile
77321
774\end{minted}
775Comme on le voit, la commande entrée à la ligne~1 renvoie deux
776informations: le nombre de lignes du fichier (21) et le nom du fichier
777lui-même. Quant à la commande de la ligne~3, elle utilise l'opérateur
778de redirection \verb|<| qui a pour effet de passer en argument à la
779commande non pas un nom de fichier à traiter, mais son contenu seul,
780lu puis redirigé. C'est une variante anonyme de la commande de la
781ligne~1.
782
783\paragraph{Chaînage}
784En anglais, \emph{piping}. Comme nous l'avons vu, la redirection
785permet d'envoyer des résultats vers des fichiers ou bien des contenus
786de fichiers vers des commandes. Le \emph{chaînage} consiste à faire
787passer un résultat fourni par une commande à une autre commande censée
788en fournir un nouveau traitement. L'opérateur de chaînage est le
789caractère \emph{pipe} (\verb+|+).
790
791Avant d'aller plus loin, étudions rapidement deux nouvelles commandes
792qui servent à filtrer le contenu des fichiers.
793
794\paragraph{head}
795\mintinline{text}|head -<num> fichier| affiche au terminal les
796\verb|<num>| premières lignes d'un fichier. Sans l'option
797\mintinline{text}|-<num>|, les 10 premières lignes sont
798affichées. Exemple:
799\begin{minted}{text}
800[robert@kiddo courses]$ head -3 ls-R
801./fichiers/01-ligne-de-commande.tex
802./makefile
803./_preamble.tex
804\end{minted}
805
806\paragraph{tail}
807\mintinline{text}|tail -<num> fichier| affiche au terminal les
808\verb|<num>| dernières lignes d'un fichier. Sans l'option
809\mintinline{text}|-<num>|, les 10 dernières lignes sont affichées.
810Exemple:
811\begin{minted}{text}
812[robert@kiddo courses]$ tail -3 ls-R
813./_preamble.tex
814./README.md
815./README.tex
816\end{minted}
817En outre, on peut passer à \verb|tail| l'option %
818\mintinline{text}|-n +<num>| qui affiche tout un fichier jusqu'à la
819dernière ligne, \emph{mais en commençant à partir de la ligne}
820\verb|<num>|. L'exemple suivant en montre une application directe.
821
822Cet exemple reprend des commandes connues. Supposons que l'on veuille
823connaître simplement le nombre de fichiers du notre dépôt Git. Nous
824savons produire une liste à l'aide de la commande \verb|ls -l|. Nous
825savons également que la commande \verb|wc -l| compte les
826lignes. Cependant, la première ligne retournée par la commande
827\verb|ls -l|, qui donne la somme des \emph{file system blocks} occupés
828par le contenu du répertoire, doit être exclue du compte (voir
829\emph{supra}, \vpageref{ref:file-system-blocks}). C'est ici
830qu'intervient la commande, \verb|tail|, qui retourne les dernières
831lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne
832sera ignorée:
833\begin{minted}{text}
834[robert@kiddo courses]$ ls -l | tail -n +2 | wc -l
8356
836\end{minted}
837
408\end{document} 838\end{document}