\input{../_preamble}
\usepackage{menukeys}
\title{La ligne de commande}
\usepackage{dingbat}
\usepackage{mdframed}
\mdfsetup{
  backgroundcolor=Lavender,
  hidealllines=true}
\usepackage{minted}
\surroundwithmdframed{minted}
\setminted{
  breaklines,
  breaksymbolright=\small\carriagereturn}
\setmintedinline{bgcolor=Lavender}
\usepackage{soul}
\begin{document}
\maketitle
\renewcommand{\contentsname}{Sommaire}
\tableofcontents

\chapter{Introduction}
\label{cha:introduction}
La \emph{ligne de commande} est avant tout une interface de
communication avec l'ordinateur, tout comme le sont les interfaces
graphiques auxquelles nous sommes habitués. Les interfaces graphiques
telles que le \emph{Bureau} sous Windows ou bien le \emph{Finder} sous
Mac OS sont en réalité comme une couche qui se superpose à la ligne de
commande, qui continue toujours à exister. Tout en masquant à
l'utilisateur la ligne de commande, elles traduisent néanmoins en
ligne de commande les opérations qui sont faites à l'aide de la
souris.

\paragraph{Exemple} Supposons que l'on veuille créer un
répertoire\footnote{C'est ansi que l'on appellera ce qui, sous Windows
  et Mac OS X, se nomme \emph{dossier}.} nommé \emph{travail} sur le
bureau, puis déplacer dans ce réperoire un fichier \emph{exemple.pdf}
que l'on vient de créer. À l'aide de la souris, on doit à peu près
effectuer les opérations suivantes:
\begin{enumerate}
\item faire un simple-clic du bouton droit de la souris, et choisir
  \menu{Dossier>Nouveau} dans le menu contextuel qui s'affiche;
\item dans la fenêtre qui s'affiche, saisir le nom du nouveau
  répertoire: \directory{travail}, puis cliquer sur le bouton
  \menu{Ok};
\item dernière opération, le déplacement du fichier
  \emph{exemple.pdf}: à l'aide du bouton gauche de la souris, faire
  glisser le fichier \emph{exemple.pdf} sur l'icône du répertoire
  \emph{travail}, et relâcher le bouton à ce moment.
\end{enumerate}
Pour réaliser les mêmes opérations à la ligne de commande, il aurait
fallu saisir les lignes suivantes:
\begin{enumerate}
\item création du dossier \emph{travail}:\\
  \mintinline{text}{mkdir travail}
\item déplacement du fichier \emph{exemple.pdf} dans le dossier
  travail: \\
\mintinline{text}{mv exemple.pdf travail}
\end{enumerate}

\paragraph{Commentaire}
Il faut bien comprendre que le rôle de l'interface graphique n'est que
de traduire en lignes de commande les opérations que nous effectuons à
l'aide de la souris.  Reprenons à présent les deux dernières lignes de
commande pour mieux les comprendre:
\label{sec:commentaire}
\begin{enumerate}
\item dans \og\mintinline{text}{mkdir travail}\fg,
  \mintinline{text}{mkdir} est le nom d'un programme fait pour créer
  des répertoires; \mintinline{text}{mkdir} est en effet pour
  l'anglais \emph{make directory}. Quant à \emph{travail}, c'est tout
  simplement le nom du répertoire qu'on veut faire créer par le
  programme \mintinline{text}{mkdir}. La terminologie est la suivante:
  \mintinline{text}{mkdir} est le nom du programme, et
  \mintinline{text}{travail} est \emph{l'argument} que l'on passe à
  \mintinline{text}{mkdir}. Remarquez que l'on doit séparer l'argument
  du nom du programme par un espace. Pour terminer, on appuie sur la
  touche \emph{Entrée} pour commander l'exécution du programme.
\item dans \og\mintinline{text}{mv exemple.pdf travail}\fg, le nom du
  programme est \mintinline{text}{mv}, pour l'anglais \emph{move}; sa
  fonction est de déplacer des fichiers ou des répertoires. Comme son
  comportement, par rapport au programme \mintinline{text}{mkdir}, est
  différent, il accepte non pas un, mais deux arguments, chacun séparé
  par des espaces.  Observez de nouveau cette ligne de commande:
  tandis que le premier argument est le nom du fichier que l'on
  souhaite déplacer, le deuxième est le nom du répertoire de
  destination de ce fichier. Pour terminer, de la même manière que
  précédemment, on appuie sur la touche \emph{Entrée} pour commander
  le déplacement du fichier.
\end{enumerate}

Par cet exemple, on espère faire comprendre que si la syntaxe de la
ligne de commande peut paraître au premier abord difficile à
maîtriser, elle permet aussi, par sa sobriété même, de réaliser de
manière bien plus rapide et bien plus sûre les opérations que l'on
fait à l'aide de la souris. En voici les principales raisons:
\begin{itemize}
\item l'interface graphique est une surcouche logicielle; elle
  ralentit donc le système d'exploitation;
\item l'interface graphique, comme tout logiciel très complexe,
  comporte des erreurs de programmation. Ces \emph{bugs} peuvent aller
  jusqu'à bloquer com\-plè\-te\-ment le système d'exploitation;
\item à l'aide de l'interface graphique, on ne peut réaliser que les
  équivalents en ligne de commande qui ont été prévus par les
  programmeurs. En se privant de la ligne de commande, l'utilisateur
  se prive donc aussi de pouvoir réaliser les opérations qui ont été
  laissées de côté\footnote{C'est d'ailleurs ainsi, bien souvent, que
    les techniciens compétents dépannent les ordinateurs: en réalisant
    des commandes auxquelles l'interface graphique ne permet pas
    d'accéder.};
\item les lignes de commande peuvent être chaînées. Ainsi, par la
  simple ligne\\ \mintinline{text}{mkdir travail ; mv exemple.pdf
    travail} on peut réaliser en une seule fois toutes les opérations
  décrites pré\-cé\-dem\-ment. Il suffit, comme on le voit ici, de
  séparer les commandes par un point-virgule \mintinline{text}{;};
\item les lignes de commande acceptent des caractères appelés
  \emph{jokers} à l'aide desquels on peut déclencher des opérations
  complexes, portant sur un très grand nombre de fichiers. Par
  exemple, le caractère \mintinline{text}{*} peut se substituer à
  n'importe quelle chaîne de caractères. Ainsi, pour reprendre ce qui
  précède, la commande\\ \mintinline{text}{mv *.pdf travail} aura pour
  effet de déplacer automatiquement tous les fichiers au format
  \verb|PDF| dans le répertoire \emph{travail}.
\end{itemize}

En d'autres termes, en passant par la ligne de commande, l'utilisateur
gagne en sécurité, en rapidité et en maîtrise du système ce qu'il perd
en ergonomie.

\section{Lancement du terminal}
\label{sec:lanc-du-term}
\begin{enumerate}
\item Sous Linux, il suffit de rechercher dans le menu une application
  nommée \emph{terminal} ou \emph{xterm} dans les \emph{outils
    système}.
\item Sous MacOs, l'application s'appelle \emph{terminal}. Elle donne
  accès à un nombre limité de commandes.
\item Sous Windows, il faut installer \emph{Cygwin} qui est disponible
  à l'adresse suivante: \url{https://cygwin.com}. Pour savoir comment
  faire:
  \begin{enumerate}
  \item \url{https://x.cygwin.com/docs/ug/setup.html} (en anglais)
  \item \url{http://migale.jouy.inra.fr/?q=fr/cygwin-install} (en
    français: dans ce document, il faut cependant sauter le point 10a)
  \end{enumerate}
\end{enumerate}

\chapter{Chemins d'accès et premières commandes}
\label{cha:les-chemins-dacces}
Les commandes portent le plus souvent sur des fichiers. Il est donc
important, pour savoir où se trouvent les fichiers que vous voulez
traiter, de connaître leur \emph{chemin d'accès}.

\section{Chemins relatifs et absolus}
\label{sec:chemins-relatifs-et}

\paragraph{Le home directory}
\label{sec:le-home-directory}
Dans les systèmes Linux, tous vos fichiers se trouvent dans votre
répertoire personnel, appelé le \emph{home directory}. Le nom de votre
répertoire personnel est le même que celui de l'identifiant sous
lequel vous vous êtes connecté. Par ailleurs, tous les répertoires des
différents utilisateurs sont situés à la racine du disque dur dans un
répertoire fondamental appelé \mintinline{text}{home}.

Supposons que votre identifiant soit \mintinline{text}{jacques}; votre
répertoire personnel sera donc:
\begin{minted}{text}
/home/jacques
\end{minted}
Obervez attentivement cette ligne. Vous remarquez que les noms des
répertoires sont séparés par le caractère \mintinline{text}{/}. Cela
veut dire que le signe \mintinline{text}{/} est utilisé pour indiquer
que l'on passe d'un répertoire donné à l'un de ses
sous-répertoires. Dans notre exemple, le répertoire
\mintinline{text}{jacques} est donc inclus dans le répertoire
\mintinline{text}{home}.

Remarquez encore le \mintinline{text}{/} qui est placé \emph{devant}
\mintinline{text}{home}: comme il n'est lui-même précédé de rien, il
indique que le répertoire \mintinline{text}{home} est placé \emph{à la
  racine du disque dur}.

\paragraph{Definition: chemins absolus, chemins relatifs}
\label{sec:chem-absol-chem}
Un chemin d'accès est dit \emph{absolu} quand il est donné à partir de
la racine du disque dur. Il est \emph{relatif} quand il est donné à
partir de tout autre endroit du disque dur. Soit par exemple le
répertoire \mintinline{text}{travail} créé par l'utilisateur
\mintinline{text}{jacques} dans son répertoire personnel. À partir de
ce répertoire, le chemin d'accès absolu sera
\begin{minted}{text}
/home/jacques/travail/
\end{minted}
tandis que le chemin relatif sera
\begin{minted}{text}
travail/
\end{minted}
Corrolaire: tout chemin d'accès absolu commence nécessairement par le
caractère \mintinline{text}{/}; quand ce n'est pas le cas, le chemin
d'accès est nécessairement relatif.

\paragraph{Conventions}
\label{sec:conventions}
Il existe un grand nombre de raccourcis ou de signes conventionnels
qui sont utilisés dans la ligne de commande. On en retiendra trois
pour le moment:
\begin{itemize}
\item \emph{home directory}: depuis tout endroit du disque dur, tout
  utilisateur peut accéder à son répertoire personnel par le raccourci
\begin{minted}{text}
~/
\end{minted}
  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 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}

\section{Premières commandes}
\label{sec:prem-comm}

\paragraph{pwd}
\label{sec:pwd}
Signifie \emph{print working directory}. Cette commande vous retourne
tout simplement le chemin d'accès absolu du répertoire dans lequel
vous vous trouvez. Très utile pour ne pas se perdre! Exemple:
\begin{minted}{text}
[robert@kiddo ~]$ pwd
/home/robert
\end{minted}
\begin{quoting}\footnotesize
  La séquence \mintinline{text}+[robert@kiddo ~]$+ est \emph{l'invite
    de commande} (anglais \emph{prompt}). C'est à la suite de cette
  invite que l'on entre les commandes. Nous y reviendrons. Observez
  pour le moment quelques unes des informations données par cette
  invite: l'utilisateur \mintinline{text}{robert} est connecté sur
  l'ordinateur \mintinline{text}{kiddo}; ensuite, le signe
  \mintinline{text}+~+ indique qu'il se trouve dans son \emph{home
    directory}, ce que retourne en effet la commande
  \mintinline{text}+pwd+ qui a été entrée ici. Enfin, le signe
  \mintinline{text}|$| indique que l'utilisateur
  \mintinline{text}|robert| n'est pas l'administrateur du système. En
  effet, le \emph{prompt} de l'administrateur du système, que l'on
  appelle \emph{root}, se termine par le signe
  \mintinline{text}|#|. Exemple:
\begin{minted}{text}
[root@kiddo ~]# pwd
/root
[root@kiddo ~]# 
\end{minted}
  Remarquez que le \emph{home directory} de l'utilisateur
  \mintinline{text}|root| n'est pas situé dans le répertoire
  \mintinline{text}|/home| qui est réservé aux utilisateurs non
  privilégiés.
\end{quoting}

\paragraph{mv}
\label{sec:mv}
Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit
vers un autre. La syntaxe est la suivante:
\begin{minted}[showspaces]{text}
mv <source> <destination>
\end{minted}
\begin{quoting}\footnotesize
  Par convention, le signe \verb*+ + marque l'espace.
\end{quoting}
Exemple: déplacement du fichier \mintinline{text}{trachiniennes.pdf}
dans le répertoire \mintinline{text}{travail}:
\begin{minted}{text}
[robert@kiddo ~]$ mv trachiniennes.pdf travail/
\end{minted}
Déplacement du fichier \mintinline{text}{trachiniennes.pdf} depuis le
répertoire \mintinline{text}{travail} vers le répertoire courant
(désigné par le raccourci \mintinline{text}|.|):
\begin{minted}{text}
[robert@kiddo ~]$ mv travail/trachiniennes.pdf .
\end{minted}
Déplacement avec indication des chemins absolus:
\begin{minted}{text}
[robert@kiddo ~]$ mv /home/robert/trachiniennes.pdf /home/robert/travail/
\end{minted}
Utilisation de raccourcis:
\begin{minted}{text}
[robert@kiddo ~]$ mv ~/trachiniennes.pdf ~/travail/
\end{minted}

\paragraph{cp}
\label{sec:cp}
Signifie \emph{copy}. Cette commande copie des fichiers depuis un
endroit vers un autre. La syntaxe est comparable à celle de la
séquence \mintinline{text}{mv}.
\begin{minted}[showspaces]{text}
cp <source> <destination>
\end{minted}
Exemple: copie du fichier \mintinline{text}{trachiniennes.pdf} dans le
répertoire \mintinline{text}{travail}:
\begin{minted}{text}
[robert@kiddo ~]$ cp trachiniennes.pdf travail/
\end{minted}
Copie du fichier \mintinline{text}{trachiniennes.pdf} depuis le
répertoire \mintinline{text}{travail} vers le répertoire courant
(désigné par le raccourci \mintinline{text}|.|):
\begin{minted}{text}
[robert@kiddo ~]$ cp travail/trachiniennes.pdf .
\end{minted}
Copie avec indication des chemins absolus:
\begin{minted}{text}
[robert@kiddo ~]$ cp /home/robert/trachiniennes.pdf /home/robert/travail/
\end{minted}
Utilisation de raccourcis:
\begin{minted}{text}
[robert@kiddo ~]$ cp ~/trachiniennes.pdf ~/travail/
\end{minted}

\paragraph{cd}
\label{sec:cd}
Signifie \emph{change directory}. Permet de changer de répertoire
courant, par exemple pour travailler sur les fichiers d'un répertoire
différent de son \emph{home directory}. La syntaxe est la suivante:
\begin{minted}[showspaces]{text}
cd <chemin_d'accès_du_nouveau_répertoire>
\end{minted}

Exemple: changement vers le répertoire \mintinline{text}|/usr/bin|:
\begin{minted}{text}
[robert@kiddo ~]$ cd /usr/bin
[robert@kiddo /usr/bin]$ 
\end{minted}
\begin{quoting}\footnotesize
  Remarquez le changement de l'invite après l'exécution de la
  commande. L'invite nous donne l'indication du nouveau répertoire.
\end{quoting}
Confirmation par la commande \mintinline{text}{pwd}:
\begin{minted}{text}
[robert@kiddo /usr/bin]$ pwd
/usr/bin
[robert@kiddo /usr/bin]$ 
\end{minted}
\begin{quoting}\footnotesize
  NB: la commande \mintinline{text}{cd} seule fait revenir l'utilisateur
  directement dans son \emph{home directory}.
\end{quoting}

\paragraph{ls}
\label{sec:ls}
Signifie \emph{list}. Affiche à l'écran tous les fichiers et les
répertoires contenus dans un répertoire donné. Si on ne précise pas le
répertoire dont il faut lister les fichiers, la commande liste les
fichiers du répertoire courant. Exemple: on vérifie que le fichier
\mintinline{text}{trachiniennes.pdf} se trouve bien dans le répertoire
travail:
\begin{minted}{text}
[robert@kiddo ~]$ ls travail/
trachiniennes.pdf
\end{minted}
\begin{quoting}\footnotesize
  Comme on le voit, la commande retourne le nom du seul fichier qui se
  trouve dans le répertoire \mintinline{text}{travail}.\\
  La commande \mintinline{text}{ls} est l'une des plus importantes;
  elle admet de nombreuses options que nous détaillerons plus loin
  dans ce cours.
\end{quoting}

\section{Options}
\label{sec:options}
On a donné plus haut l'exemple de la commande \mintinline{text}|ls|
qui affiche à l'écran tous les fichiers contenus dans un répertoire
donné. Voici ce que retourne cette commande lancée sur notre dépôt
Git:
\begin{minted}{text}
[robert@kiddo courses]$ ls
fichiers ls-R makefile _preamble.tex README.md README.pdf README.tex texfiles
\end{minted}

Mais on peut souhaiter recueillir davantage d'informations. Par
exemple, dans la liste ci-dessus, on ne peut pas distinguer les
fichiers des répertoires. Heureusement, les commandes peuvent recevoir
des \emph{options}. Celles-ci sont de deux types:
\begin{enumerate}
\item Les options \enquote{longues}, qui sont préfixées par
  \mintinline{text}|--| et suivies de noms entiers.
\item Les options \enquote{courtes}, qui sont préfixées par
  \mintinline{text}|-| et suivies d'abréviations.
\end{enumerate}
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}
[robert@kiddo courses]$ ls -l --color
total 56
drwxr-xr-x 3 robert robert  4096 12 sept. 21:52 |\textcolor{blue}{fichiers}|
-rw-r--r-- 1 robert robert    88 12 sept. 20:57 ls-R
-rw-r--r-- 1 robert robert   627 12 sept. 15:11 makefile
-rw-r--r-- 1 robert robert   558 12 sept. 11:20 _preamble.tex
-rw-r--r-- 1 robert robert  1254 12 sept. 20:57 README.md
-rw-r--r-- 1 robert robert 27345 12 sept. 20:58 README.pdf
-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}
\end{document}
