From 7744a531055d3a50d9efdca616799966b636665d Mon Sep 17 00:00:00 2001 From: Robert Alessi Date: Thu, 13 Sep 2018 19:22:23 +0200 Subject: fichiers/01-ligne-de-commande.tex almost complete --- _preamble.tex | 6 +- fichiers/01-ligne-de-commande.tex | 446 +++++++++++++++++++++++++++++++++++++- 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 @@ \usepackage[french]{babel} \usepackage{fontspec} +\setmainfont{Old Standard} \addtokomafont{disposition}{\rmfamily} \usepackage{csquotes} \usepackage[font=footnotesize, rightmargin=0pt]{quoting} \usepackage[svgnames]{xcolor} +\usepackage[french]{varioref} \usepackage{hyperref} -\hypersetup{unicode,colorlinks} +\hypersetup{unicode,colorlinks,allcolors=blue,linktocpage} \usepackage{hyperxmp} \usepackage{uri} \usepackage[type={CC}, modifier={by-sa}, version ={3.0}]{doclicense} \author{Robert Alessi} \lowertitleback{\footnotesize\textcopyright{} 2018 Robert Alessi \mailto[courses]{robert.alessi@cnrs.fr} - \doclicenseThis} + \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 @@ \input{../_preamble} \usepackage{menukeys} \title{La ligne de commande} +\usepackage{units} +\usepackage{cleveref} +\usepackage{booktabs} +\usepackage{xltabular} \usepackage{dingbat} \usepackage{mdframed} \mdfsetup{ @@ -213,13 +217,14 @@ pour le moment: Ainsi, pour l'utilisateur \mintinline{text}{jacques}, \mintinline{text}{~/travail} est l'équivalent de \\ \mintinline{text}{/home/jacques/travail}. -\item répertoire parent: quel que soit le répetoire dans lequel on se - trouve, la séquence \mintinline{text}{..} désigne le - \emph{répertoire parent}, c'est-à-dire le répertoire qui le - contient, ou bien qui est situé au niveau supérieur dans - l'arborescence du disque dur. Par exemple, à partir du répertoire - \mintinline{text}{/home/jacques/travail}, \mintinline{text}{..} - désigne le répertoire \mintinline{text}{/home/jacques}. +\item \label{ref:parent-current}répertoire parent: quel que soit le + répetoire dans lequel on se trouve, la séquence + \mintinline{text}{..} désigne le \emph{répertoire parent}, + c'est-à-dire le répertoire qui le contient, ou bien qui est situé au + niveau supérieur dans l'arborescence du disque dur. Par exemple, à + partir du répertoire \mintinline{text}{/home/jacques/travail}, + \mintinline{text}{..} désigne le répertoire + \mintinline{text}{/home/jacques}. \item répertoire courant: Quant au signe \og\mintinline{text}{.}\fg, il désigne tout simplement le répertoire dans lequel on se trouve. \end{itemize} @@ -393,7 +398,7 @@ des \emph{options}. Celles-ci sont de deux types: Voici donc ce que donne la même commande \mintinline{text}|ls|, suivie de l'option \mintinline{text}|-l| pour \enquote{use a \ul{l}ong listing format} et de l'option \mintinline{text}|--color|: -\begin{minted}[escapeinside=||]{text} +\begin{minted}[escapeinside=||,linenos]{text} [robert@kiddo courses]$ ls -l --color total 56 drwxr-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}| -rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex -rw-r--r-- 1 robert robert 49 12 sept. 20:57 texfiles \end{minted} +\begin{quoting} + \textbf{Remarque} L'option \mintinline{text}|--color| permet de + distinguer facilement les fichiers et les répertoires. +\end{quoting} + +\paragraph{Commentaire} +\label{ref:file-system-blocks} +L'option \mintinline{text}|-l|, \enquote{long listing format}, affiche +d'abord sur la première ligne la somme des \emph{file system blocks} +occupés par les fichiers qui sont listés\footnote{Le \emph{file system + block} est la plus petite unité d'écriture possible sur un sytème + de fichiers donné.}. Les fichiers et les répertoires sont ensuite +donnés dans les lignes suivantes. Prenons comme exemple la ligne~4 +ci-dessus: +\begin{minted}{text} +-rw-r--r-- 1 robert robert 88 12 sept. 20:57 ls-R +\end{minted} +Il faut l'analyser en dix parties, de la façon suivante: +\bgroup\ttfamily +\begin{xltabular}{1.0\linewidth}{XXXXXXXXXX} + \toprule + 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \midrule\endhead + - & rw- & r-- & r-- & 1 & robert & robert & 88 & 12 sept. 20:57 & + ls-R + \\ + \bottomrule +\end{xltabular} +\egroup + +Voici une analyse simplifiée de cette ligne. Retenez que d'autres +valeurs que celles qui sont commentées ci-dessous sont possibles. +\begin{enumerate} +\item Peut avoir les valeurs suivantes: + \begin{itemize} + \item \mintinline{text}|-| pour les fichiers; + \item \mintinline{text}|d| pour les répertoires; + \item \mintinline{text}|l| pour les liens. + \end{itemize} +\item Permissions données au propriétaire. Il y a trois types de + permissions que vous devez connaître ici: + \begin{itemize} + \item \mintinline{text}|-|: aucune permission; + \item \mintinline{text}|r|: permission en lecture; + \item \mintinline{text}|w|: permission en écriture; + \item \mintinline{text}|x|: permission en exécution. + \end{itemize} + La première position représente les droits en \emph{lecture} + (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|r|); + La deuxième position représente les droits en \emph{écriture} + (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|w|); + La troisième position représente les droits en \emph{exécution} + (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|x|). +\item Permission de \emph{groupe}. Les groupes peuvent réunir + plusieurs utilisateurs. Par exemple, on peut créer un groupe + \emph{travail} et y mettre plusieurs utilisateurs qui auront ainsi + des permissions communes sur les fichiers et les répertoires. +\item Permissions données à tout le monde. +\item Le nombre de liens sur le fichier ou le répertoire listé. Un + fichier a en principe au moins un lien tandis qu'un répertoire en a + au moins deux car le système considère que le répertoire parent et + le répertoire courant (\mintinline{text}|..| et + \mintinline{text}|.|, voir \emph{supra} + \vref{ref:parent-current}) sont des liens. +\item Le nom du propriétaire du fichier. +\item Le nom du groupe dont les membres peuvent avoir des permissions + sur le fichier. +\item La taille du fichier mesurée en \emph{bytes}\footnote{Le + \emph{byte} est une séquence de 8 \emph{bits} traitée comme une + seule unité d'information. Le \emph{bit} de données peut avoir deux + valeurs: 0 ou 1, ce nous qui rappelle que les ordinateurs sont des + machines électriques dans lesquelles le courant peut passer (1) ou + ne pas passer (0). L'unité conventionnelle du \emph{bit} est + \unit{b} tandis que l'unité du \emph{byte} est \unit{B}. Il ne + faut pas les confondre.}. +\item La date à laquelle le fichier a été créé ou modifié pour la + dernière fois. +\item Le nom du fichier. +\end{enumerate} + +\chapter{Bash, le shell} +\label{cha:bash-le-shell} +Ce que vous montre le terminal, à savoir l'invite de commande ou +\emph{prompt} en anglais, s'appelle le \emph{shell}. Il y a plusieurs +types de \emph{shells}, mais le plus connu s'appelle +\emph{bash}\footnote{Pour \emph{bourne again + shell}.}. La~\vref{sec:prem-comm} vous a appris une première série +de commandes. + +Les commandes portent sur les \emph{fichiers}. Avant de continuer, il +faut savoir que sous Linux \emph{tout est fichier}: un fichier texte +est un fichier, mais un répertoire aussi, de même que le clavier, +l'écran et tous les périphériques de l'ordinateur sont des +fichiers. Ainsi, un programme vidéo qui joue un film ne fait pas autre +chose que copier des séquences vidéo vers le fichier qui désigne +l'écran et des séquences son vers le fichier qui désigne la carte +son. + +La deuxième chose à savoir est que Linux est un système dit \emph{sans + extension}. L'\emph{extension} est une séquence de 1 à 4 caractères +placée après un point dans un nom de fichier. Elle permet de connaître +quel est le type de chaque fichier. Par exemple, c'est par l'extension +que l'on saura que \verb+fichier.png+ est un fichier image. + +À la différence d'autres systèmes informatiques, Linux ne fait aucun +cas de l'extension mais regarde directement à l'intérieur de chaque +fichier pour en déterminer le type. + +\paragraph{file} +La commande \mintinline{text}|file| permet de tout savoir sur les +types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt +Git: +\begin{minted}[linenos]{text} +[robert@kiddo courses]$ file * +fichiers: directory +ls-R: ASCII text +makefile: makefile script, ASCII text +_preamble.tex: LaTeX 2e document, ASCII text +README.md: UTF-8 Unicode text +README.pdf: PDF document, version 1.5 +README.tex: LaTeX 2e document, UTF-8 Unicode text +texfiles: ASCII text +\end{minted} +\begin{quoting} + \textbf{Remarques:} + \begin{enumerate} + \item Les éléments des lignes 2, 3, 4 et 9 n'ont pas d'extension + mais Linux détermine leur type de façon précise. + \item À la suite de la commande \mintinline{text}|file|, le + caractère \mintinline{text}|*| a une signification spéciale: il + désigne toute séquence formée par zéro ou plus de caractères: on + l'a utilisé ici pour lister tous les fichiers du répertoire + courant (v. \emph{infra} \vref{sec:wildcards} pour plus de + détails). + \end{enumerate} +\end{quoting} + +\paragraph{Minuscules et majuscules} +À savoir également: Linux est sensible à la casse dans les noms des +fichiers. Ainsi, \verb+fichier.txt+ et \verb+Fichier.txt+ sont deux +fichiers différents. + +\paragraph{Espaces} +Soit la commande suivante: +\begin{minted}{text} +[robert@kiddo courses]$ ls -l README.md README.pdf +-rw-r--r-- 1 robert robert 1254 13 sept. 08:14 README.md +-rw-r--r-- 1 robert robert 27345 13 sept. 08:15 README.pdf +\end{minted} +Comme on l'a vu plus haut (\vref{sec:options}), le \emph{shell} n'a +pas de mal à distinguer l'\emph{option courte} des \emph{arguments} +car à la différence des arguments, l'option est préfixée par le signe +\mintinline{text}|-|. La commande est donc interprétée de la façon +suivante: \enquote{veuillez donner des informations au \emph{format + long} sur les deux fichiers \texttt{README.md} et + \texttt{README.pdf}}. + +C'est donc l'\emph{espace} qui sert à délimiter les options et les +arguments dans les commandes du \emph{shell}. Techniquement, comme +l'espace est interprété comme un délimiteur, on dit que c'est un +\emph{caractère actif} du \emph{shell}. Ainsi, dans une ligne de +commande, un fichier nommé \verb+photos de vacances.zip+ sera +interprété comme une suite distincte de trois arguments: +\begin{enumerate} +\item \verb+photos+ +\item \verb+de+ +\item \verb+vacances.zip+ +\end{enumerate} +Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions +possibles: +\begin{enumerate} +\item Placer le nom du fichier entre guillemets simples: +\begin{minted}{text} +[robert@kiddo courses]$ ls 'photos de vacances.zip' +'photos de vacances.zip' +\end{minted} +\item Préfixer les espaces par ce qu'on appelle l'\emph{escape + character} qui est le \emph{backslash} (\verb+\+) +\begin{minted}{text} +[robert@kiddo courses]$ ls photos\ de\ vacances.zip +'photos de vacances.zip' +\end{minted} + Le rôle du caractère d'échappement est en effet d'annuler la + signification particulière du caractère qui le suit. Or dans le + \emph{shell}, l'espace est un \emph{caractère actif} puisqu'il est + le délimiteur entre les commandes, les options et les arguments. +\end{enumerate} +\begin{quoting} + On comprendra qu'il vaut mieux éviter d'utiliser les espaces dans + les noms des fichiers. À la place des espaces, on utilisera le + caractère de soulignement ou \emph{underscore}: + \verb+photos_de_vacances.zip+ +\end{quoting} + +\paragraph{Fichiers cachés} +Tout fichier dont le nom commence par un point (\mintinline{text}|.|) +est considéré comme un fichier caché. Le plus souvent, les fichiers +cachés contiennent des paramètres de configuration. La commande +\mintinline{text}|ls| est capable de les afficher si on lui passe +l'option \mintinline{text}|-a| pour \emph{all}. Appliquons cette +option sur notre dépôt Git: +\begin{minted}[escapeinside=||,linenos]{text} +[robert@kiddo courses]$ ls -la +total 72 +drwxr-xr-x 4 robert robert 4096 13 sept. 12:44 . +drwxr-xr-x 6 robert robert 4096 10 sept. 11:04 .. +drwxr-xr-x 3 robert robert 4096 13 sept. 12:44 |\textcolor{blue}{fichiers}| +drwxr-xr-x 8 robert robert 4096 13 sept. 11:29 |\textcolor{blue}{.git}| +-rw-r--r-- 1 robert robert 19 1 août 2017 .gitignore +-rw-r--r-- 1 robert robert 88 13 sept. 08:14 ls-R +-rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile +-rw-r--r-- 1 robert robert 588 13 sept. 11:29 _preamble.tex +-rw-r--r-- 1 robert robert 1254 13 sept. 08:14 README.md +-rw-r--r-- 1 robert robert 27345 13 sept. 08:15 README.pdf +-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex +-rw-r--r-- 1 robert robert 49 13 sept. 08:14 texfiles +\end{minted} +Nous voyons ainsi apparaître à la ligne~6 un répertoire caché et à la +ligne~7 un fichier caché. + +\section{Commandes courantes} +\label{sec:commandes-courantes} + +Ces commandes s'ajoutent à celles qui sont décrites plus haut +(\vref{sec:prem-comm}). + +\paragraph{mkdir} +Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p| +peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou +plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour +\emph{verbose}, demande aussi à \verb|mkdir| de retourner un message +de confirmation: +\begin{minted}{text} +[robert@kiddo courses]$ mkdir -pv sandbox/robert +mkdir: création du répertoire 'sandbox' +mkdir: création du répertoire 'sandbox/robert' +\end{minted} + +\paragraph{touch} +Sert à créer un fichier vide dont le nom est passé en argument. Cette +commande sert également à modifier les métadonnées de temps associées +aux fichiers (date de création et/ou de modification). + +L'exemple suivant montre comment créer un nouveau dossier dans lequel +on crée également un fichier vide \verb|fichier.txt|. Ensuite, on +utilise la commande \verb|mv| pour \emph{déplacer} ce fichier vers un +autre fichier \verb|fichier-mk2.txt| au même endroit. Le résultat de +cette action particulière, le \emph{déplacement au même endroit}, est +tout simplement de renommer le fichier. Enfin, la commande % +\verb|ls -l| sert de moyen de contrôle: +\begin{minted}{text} +[robert@kiddo courses]$ mkdir -pv sandbox +mkdir: création du répertoire 'sandbox' +[robert@kiddo courses]$ touch sandbox/fichier.txt +[robert@kiddo courses]$ mv sandbox/fichier.txt sandbox/fichier-mk2.txt +[robert@kiddo courses]$ ls -l sandbox/ +total 0 +-rw-r--r-- 1 robert robert 0 13 sept. 15:51 fichier-mk2.txt +\end{minted} + +\subsection{Commandes destructives} +\label{sec:comm-destr} + +\paragraph{rm} +Pour \emph{remove}. Il suffit de passer en argument à cette commande +ce que l'on souhaite détruire. Par défaut, cette commande ne détruit +pas les répertoires. Elle accepte une série d'options dont voici les +plus importantes: +\begin{description} +\item[-i] demande une confirmation à chaque opération de destruction. +\item[-f] pour \emph{force}; fait le contraire de \verb|-i|. +\item[-r] pour \emph{recursive}; détruit les répertoires et leur + contenu. +\end{description} + +\begin{mdframed}[backgroundcolor=Cyan] +Cette commande doit être exécutée avec précaution car il n'y a aucun +retour en arrière possible. +\end{mdframed} + +Par exemple, soit le répertoire \verb|sandbox|. La commande: +\begin{minted}{text} +[robert@kiddo courses]$ rm -rf sandbox +\end{minted} +détruira sans aucune demande de confirmation à la fois le répertoire +\verb|sandbox| et tout ce qu'il contient, fichiers, répertoires et +sous-répertoires. + +Pour donner une idée de la puissance de destruction de cette commande, +la ligne suivante: +\begin{minted}{text} +[robert@kiddo courses]$ rm -rf * +\end{minted} +détruira absolument tout sans demande de confirmation pour ne laisser +que les fichiers cachés du répertoire courant dont le nom commence +par un point. + +\subsection{Wildcards} +\label{sec:wildcards} +Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères +ou des séquences de caractères qui servent à représenter des séries de +caractères. On les utilise pour construire des schémas de +remplacement. Voici quels sont les plus utilisés: +\begin{itemize} +\item \verb|*| représente zéro ou plus de caractères. +\item \verb|?| représente un caractère unique. +\item \verb|[]| représente une série de caractères. Par exemple, + \verb|[QGH]| représente l'une des trois lettres majuscules Q, G ou + H. Ainsi, la commande: +\begin{minted}{text} +ls [QGH]* +\end{minted} + retournera tous les noms de fichiers qui commencent par l'une de ces + trois lettres. Pour représenter une \emph{série continue de + caractères}, on peut utiliser le trait d'union. Par exemple, + \verb|[a-z]| représente toutes les lettres minuscules non accentuées + de l'alphabet; et \verb|[A-Za-z]| toutes les lettres non accentuées, + majuscules ou minuscules. +\end{itemize} + +\subsection{Redirection et chaînage} +\label{sec:redir-et-chain} +Nous avons vu jusqu'ici que les commandes renvoient normalement leur +résultat sur le terminal lui-même. On peut cependant rediriger ce que +les commandes renvoient vers un fichier à l'aide des \emph{opérateurs + de redirection}. Trois d'entre eux sont utiles à connaître: +\begin{enumerate} +\item \verb|>| redirige vers un nouveau fichier. Si le fichier + n'existe pas, il est créé. S'il existe, il sera écrasé et remplacé + par un nouveau fichier du même nom. +\item \verb|>>| fait la même chose que \verb|>|, mais \emph{ajoute} le + résultat au fichier si celui-ci existe. +\item \verb|<| lit le contenu du fichier dont le nom suit et le passe + en argument à la commande qui précède pour traitement. +\end{enumerate} + +Dans l'exemple qui suit, on demande à la commande \verb|ls -l| de +rediriger son résultat vers un fichier \verb|all-files.txt|. On +s'assure que ce fichier a bien été créé, puis on demande à la commande +\verb|cat| d'en afficher le contenu au terminal. Les trois commandes +sont entrées aux lignes 1, 2 et 4: +\begin{minted}[escapeinside=||,linenos]{text} +[robert@kiddo courses]$ ls -l > |\textcolor{blue}{all-files.txt}| +[robert@kiddo courses]$ ls +|\textcolor{blue}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex +[robert@kiddo courses]$ cat |\textcolor{blue}{all-files.txt}| +total 24 +drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers +-rw-r--r-- 1 robert robert 88 13 sept. 13:34 ls-R +-rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile +-rw-r--r-- 1 robert robert 668 13 sept. 15:26 _preamble.tex +-rw-r--r-- 1 robert robert 1254 13 sept. 13:34 README.md +-rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex +\end{minted} + +L'exemple suivant est plus subtil. Il fait appel à une commande, +\verb|wc -l| qui compte les lignes des fichiers: +\begin{minted}[linenos]{text} +[robert@kiddo courses]$ wc -l makefile +21 makefile +[robert@kiddo courses]$ wc -l < makefile +21 +\end{minted} +Comme on le voit, la commande entrée à la ligne~1 renvoie deux +informations: le nombre de lignes du fichier (21) et le nom du fichier +lui-même. Quant à la commande de la ligne~3, elle utilise l'opérateur +de redirection \verb|<| qui a pour effet de passer en argument à la +commande non pas un nom de fichier à traiter, mais son contenu seul, +lu puis redirigé. C'est une variante anonyme de la commande de la +ligne~1. + +\paragraph{Chaînage} +En anglais, \emph{piping}. Comme nous l'avons vu, la redirection +permet d'envoyer des résultats vers des fichiers ou bien des contenus +de fichiers vers des commandes. Le \emph{chaînage} consiste à faire +passer un résultat fourni par une commande à une autre commande censée +en fournir un nouveau traitement. L'opérateur de chaînage est le +caractère \emph{pipe} (\verb+|+). + +Avant d'aller plus loin, étudions rapidement deux nouvelles commandes +qui servent à filtrer le contenu des fichiers. + +\paragraph{head} +\mintinline{text}|head - fichier| affiche au terminal les +\verb|| premières lignes d'un fichier. Sans l'option +\mintinline{text}|-|, les 10 premières lignes sont +affichées. Exemple: +\begin{minted}{text} +[robert@kiddo courses]$ head -3 ls-R +./fichiers/01-ligne-de-commande.tex +./makefile +./_preamble.tex +\end{minted} + +\paragraph{tail} +\mintinline{text}|tail - fichier| affiche au terminal les +\verb|| dernières lignes d'un fichier. Sans l'option +\mintinline{text}|-|, les 10 dernières lignes sont affichées. +Exemple: +\begin{minted}{text} +[robert@kiddo courses]$ tail -3 ls-R +./_preamble.tex +./README.md +./README.tex +\end{minted} +En outre, on peut passer à \verb|tail| l'option % +\mintinline{text}|-n +| qui affiche tout un fichier jusqu'à la +dernière ligne, \emph{mais en commençant à partir de la ligne} +\verb||. L'exemple suivant en montre une application directe. + +Cet exemple reprend des commandes connues. Supposons que l'on veuille +connaître simplement le nombre de fichiers du notre dépôt Git. Nous +savons produire une liste à l'aide de la commande \verb|ls -l|. Nous +savons également que la commande \verb|wc -l| compte les +lignes. Cependant, la première ligne retournée par la commande +\verb|ls -l|, qui donne la somme des \emph{file system blocks} occupés +par le contenu du répertoire, doit être exclue du compte (voir +\emph{supra}, \vpageref{ref:file-system-blocks}). C'est ici +qu'intervient la commande, \verb|tail|, qui retourne les dernières +lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne +sera ignorée: +\begin{minted}{text} +[robert@kiddo courses]$ ls -l | tail -n +2 | wc -l +6 +\end{minted} + \end{document} -- cgit v1.2.3