\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} \begin{document} \maketitle \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{bash}{mkdir travail} \item déplacement du fichier \emph{exemple.pdf} dans le dossier travail: \\ \mintinline{bash}{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{bash}{mkdir travail}\fg, \mintinline{bash}{mkdir} est le nom d'un programme fait pour créer des répertoires; \mintinline{bash}{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{bash}{mkdir}. La terminologie est la suivante: \mintinline{bash}{mkdir} est le nom du programme, et \mintinline{bash}{travail} est \emph{l'argument} que l'on passe à \mintinline{bash}{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{bash}{mv exemple.pdf travail}\fg, le nom du programme est \mintinline{bash}{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{bash}{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{bash}{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{bash}{;}; \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{bash}{*} peut se substituer à n'importe quelle chaîne de caractères. Ainsi, pour reprendre ce qui précède, la commande\\ \mintinline{bash}{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{bash}{home}. Supposons que votre identifiant soit \mintinline{bash}{jacques}; votre répertoire personnel sera donc: \begin{minted}{bash} /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{bash}{/}. Cela veut dire que le signe \mintinline{bash}{/} 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{bash}{jacques} est donc inclus dans le répertoire \mintinline{bash}{home}. Remarquez encore le \mintinline{bash}{/} qui est placé \emph{devant} \mintinline{bash}{home}: comme il n'est lui-même précédé de rien, il indique que le répertoire \mintinline{bash}{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{bash}{travail} créé par l'utilisateur \mintinline{bash}{jacques} dans son répertoire personnel. À partir de ce répertoire, le chemin d'accès absolu sera \begin{minted}{bash} /home/jacques/travail/ \end{minted} tandis que le chemin relatif sera \begin{minted}{bash} travail/ \end{minted} Corrolaire: tout chemin d'accès absolu commence nécessairement par le caractère \mintinline{bash}{/}; 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}{bash} ~/ \end{minted} Ainsi, pour l'utilisateur \mintinline{bash}{jacques}, \mintinline{bash}{~/travail} est l'équivalent de \\ \mintinline{bash}{/home/jacques/travail}. \item répertoire parent: quel que soit le répetoire dans lequel on se trouve, la séquence \mintinline{bash}{..} 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{bash}{/home/jacques/travail}, \mintinline{bash}{..} désigne le répertoire \mintinline{bash}{/home/jacques}. \item répertoire courant: Quant au signe \og\mintinline{bash}{.}\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}{bash} [robert@kiddo ~]$ pwd /home/robert \end{minted} \begin{quoting}\footnotesize La séquence \mintinline{bash}+[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{bash}{robert} est connecté sur l'ordinateur \mintinline{bash}{kiddo}; ensuite, le signe \mintinline{bash}+~+ indique qu'il se trouve dans son \emph{home directory}, ce que retourne en effet la commande \mintinline{bash}+pwd+ qui a été entrée ici. Enfin, le signe \mintinline{bash}|$| indique que l'utilisateur \mintinline{bash}|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{bash}|#|. Exemple: \begin{minted}{bash} [root@kiddo ~]# pwd /root [root@kiddo ~]# \end{minted} Remarquez que le \emph{home directory} de l'utilisateur \mintinline{bash}|root| n'est pas situé dans le répertoire \mintinline{bash}|/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]{bash} mv \end{minted} \begin{quoting}\footnotesize Par convention, le signe \verb*+ + marque l'espace. \end{quoting} Exemple: déplacement du fichier \mintinline{bash}{trachiniennes.pdf} dans le répertoire \mintinline{bash}{travail}: \begin{minted}{bash} [robert@kiddo ~]$ mv trachiniennes.pdf travail/ \end{minted} Déplacement du fichier \mintinline{bash}{trachiniennes.pdf} depuis le répertoire \mintinline{bash}{travail} vers le répertoire courant (désigné par le raccourci \mintinline{bash}|.|): \begin{minted}{bash} [robert@kiddo ~]$ mv travail/trachiniennes.pdf . \end{minted} Déplacement avec indication des chemins absolus: \begin{minted}{bash} [robert@kiddo ~]$ mv /home/robert/trachiniennes.pdf /home/robert/travail/ \end{minted} Utilisation de raccourcis: \begin{minted}{bash} [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{bash}{mv}. \begin{minted}[showspaces]{bash} cp \end{minted} Exemple: copie du fichier \mintinline{bash}{trachiniennes.pdf} dans le répertoire \mintinline{bash}{travail}: \begin{minted}{bash} [robert@kiddo ~]$ cp trachiniennes.pdf travail/ \end{minted} Copie du fichier \mintinline{bash}{trachiniennes.pdf} depuis le répertoire \mintinline{bash}{travail} vers le répertoire courant (désigné par le raccourci \mintinline{bash}|.|): \begin{minted}{bash} [robert@kiddo ~]$ cp travail/trachiniennes.pdf . \end{minted} Copie avec indication des chemins absolus: \begin{minted}{bash} [robert@kiddo ~]$ cp /home/robert/trachiniennes.pdf /home/robert/travail/ \end{minted} Utilisation de raccourcis: \begin{minted}{bash} [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]{bash} cd <"chemin_d'accès_du_nouveau_répertoire"> \end{minted} Exemple: changement vers le répertoire \mintinline{bash}|/usr/bin|: \begin{minted}{bash} [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{bash}{pwd}: \begin{minted}{bash} [robert@kiddo /usr/bin]$ pwd /usr/bin [robert@kiddo /usr/bin]$ \end{minted} \begin{quoting}\footnotesize NB: la commande \mintinline{bash}{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{bash}{trachiniennes.pdf} se trouve bien dans le répertoire travail: \begin{minted}{bash} [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{bash}{travail}.\\ La commande \mintinline{bash}{ls} est l'une des plus importantes; elle admet de nombreuses options que nous détaillerons plus loin dans ce cours. \end{quoting} \end{document}