01-ligne-de-commande.tex 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. \input{../_preamble}
  2. \usepackage{menukeys}
  3. \title{La ligne de commande}
  4. \usepackage{dingbat}
  5. \usepackage{minted}
  6. \setminted{
  7. bgcolor=Lavender,
  8. breaklines,
  9. breaksymbolright=\small\carriagereturn}
  10. \setmintedinline{bgcolor=Lavender}
  11. \usepackage{soul}
  12. \makeindex[name=cmds, intoc, title={Liste des commandes et
  13. instructions}, options={-s \jobname.ist}]
  14. \NewDocumentCommand{\commande}{s m O{}}{
  15. \IfBooleanTF{#1}{\index[cmds]{#2@\texttt{#2}|#3textbf}}
  16. {\index[cmds]{#2@\texttt{#2}#3}}
  17. }
  18. \begin{document}
  19. \maketitle
  20. \renewcommand{\contentsname}{Sommaire}
  21. \tableofcontents
  22. \chapter{Introduction}
  23. \label{cha:introduction}
  24. La \emph{ligne de commande} est avant tout une interface de
  25. communication avec l'ordinateur, tout comme le sont les interfaces
  26. graphiques auxquelles nous sommes habitués. Les interfaces graphiques
  27. telles que le \emph{Bureau} sous Windows ou bien le \emph{Finder} sous
  28. Mac OS sont en réalité comme une couche qui se superpose à la ligne de
  29. commande, qui continue toujours à exister. Tout en masquant à
  30. l'utilisateur la ligne de commande, elles traduisent néanmoins en
  31. ligne de commande les opérations qui sont faites à l'aide de la
  32. souris.
  33. \paragraph{Exemple} Supposons que l'on veuille créer un
  34. répertoire\footnote{C'est ansi que l'on appellera ce qui, sous Windows
  35. et Mac OS X, se nomme \emph{dossier}.} nommé \emph{travail} sur le
  36. bureau, puis déplacer dans ce réperoire un fichier \emph{exemple.pdf}
  37. que l'on vient de créer. À l'aide de la souris, on doit à peu près
  38. effectuer les opérations suivantes:
  39. \begin{enumerate}
  40. \item faire un simple-clic du bouton droit de la souris, et choisir
  41. \menu{Dossier>Nouveau} dans le menu contextuel qui s'affiche;
  42. \item dans la fenêtre qui s'affiche, saisir le nom du nouveau
  43. répertoire: \directory{travail}, puis cliquer sur le bouton
  44. \menu{Ok};
  45. \item dernière opération, le déplacement du fichier
  46. \emph{exemple.pdf}: à l'aide du bouton gauche de la souris, faire
  47. glisser le fichier \emph{exemple.pdf} sur l'icône du répertoire
  48. \emph{travail}, et relâcher le bouton à ce moment.
  49. \end{enumerate}
  50. Pour réaliser les mêmes opérations à la ligne de commande, il aurait
  51. fallu saisir les lignes suivantes:
  52. \begin{enumerate}
  53. \item création du dossier \emph{travail}:\\
  54. \commande{mkdir}\mintinline{text}{mkdir travail}
  55. \item déplacement du fichier \emph{exemple.pdf} dans le dossier
  56. travail: \\
  57. \commande{mv}\mintinline{text}{mv exemple.pdf travail}
  58. \end{enumerate}
  59. \paragraph{Commentaire}
  60. Il faut bien comprendre que le rôle de l'interface graphique n'est que
  61. de traduire en lignes de commande les opérations que nous effectuons à
  62. l'aide de la souris. Reprenons à présent les deux dernières lignes de
  63. commande pour mieux les comprendre:
  64. \label{sec:commentaire}
  65. \begin{enumerate}
  66. \item dans \og\mintinline{text}{mkdir travail}\fg,
  67. \mintinline{text}{mkdir} est le nom d'un programme fait pour créer
  68. des répertoires; \mintinline{text}{mkdir} est en effet pour
  69. l'anglais \emph{make directory}. Quant à \emph{travail}, c'est tout
  70. simplement le nom du répertoire qu'on veut faire créer par le
  71. programme \mintinline{text}{mkdir}. La terminologie est la suivante:
  72. \mintinline{text}{mkdir} est le nom du programme, et
  73. \mintinline{text}{travail} est \emph{l'argument} que l'on passe à
  74. \mintinline{text}{mkdir}. Remarquez que l'on doit séparer l'argument
  75. du nom du programme par un espace. Pour terminer, on appuie sur la
  76. touche \emph{Entrée} pour commander l'exécution du programme.
  77. \item dans \og\mintinline{text}{mv exemple.pdf travail}\fg, le nom du
  78. programme est \mintinline{text}{mv}, pour l'anglais \emph{move}; sa
  79. fonction est de déplacer des fichiers ou des répertoires. Comme son
  80. comportement, par rapport au programme \mintinline{text}{mkdir}, est
  81. différent, il accepte non pas un, mais deux arguments, chacun séparé
  82. par des espaces. Observez de nouveau cette ligne de commande:
  83. tandis que le premier argument est le nom du fichier que l'on
  84. souhaite déplacer, le deuxième est le nom du répertoire de
  85. destination de ce fichier. Pour terminer, de la même manière que
  86. précédemment, on appuie sur la touche \emph{Entrée} pour commander
  87. le déplacement du fichier.
  88. \end{enumerate}
  89. Par cet exemple, on espère faire comprendre que si la syntaxe de la
  90. ligne de commande peut paraître au premier abord difficile à
  91. maîtriser, elle permet aussi, par sa sobriété même, de réaliser de
  92. manière bien plus rapide et bien plus sûre les opérations que l'on
  93. fait à l'aide de la souris. En voici les principales raisons:
  94. \begin{itemize}
  95. \item l'interface graphique est une surcouche logicielle; elle
  96. ralentit donc le système d'exploitation;
  97. \item l'interface graphique, comme tout logiciel très complexe,
  98. comporte des erreurs de programmation. Ces \emph{bugs} peuvent aller
  99. jusqu'à bloquer com\-plè\-te\-ment le système d'exploitation;
  100. \item à l'aide de l'interface graphique, on ne peut réaliser que les
  101. équivalents en ligne de commande qui ont été prévus par les
  102. programmeurs. En se privant de la ligne de commande, l'utilisateur
  103. se prive donc aussi de pouvoir réaliser les opérations qui ont été
  104. laissées de côté\footnote{C'est d'ailleurs ainsi, bien souvent, que
  105. les techniciens compétents dépannent les ordinateurs: en réalisant
  106. des commandes auxquelles l'interface graphique ne permet pas
  107. d'accéder.};
  108. \item les lignes de commande peuvent être chaînées. Ainsi, par la
  109. simple ligne\\ \mintinline{text}{mkdir travail ; mv exemple.pdf
  110. travail} on peut réaliser en une seule fois toutes les opérations
  111. décrites pré\-cé\-dem\-ment. Il suffit, comme on le voit ici, de
  112. séparer les commandes par un point-virgule \mintinline{text}{;};
  113. \item les lignes de commande acceptent des caractères appelés
  114. \emph{wildcards} à l'aide desquels on peut déclencher des opérations
  115. complexes, portant sur un très grand nombre de fichiers. Par
  116. exemple, le caractère \mintinline{text}{*} peut se substituer à
  117. n'importe quelle chaîne de caractères. Ainsi, pour reprendre ce qui
  118. précède, la commande\\ \mintinline{text}{mv *.pdf travail} aura pour
  119. effet de déplacer automatiquement tous les fichiers au format
  120. \verb|PDF| dans le répertoire \emph{travail}.
  121. \end{itemize}
  122. En d'autres termes, en passant par la ligne de commande, l'utilisateur
  123. gagne en sécurité, en rapidité et en maîtrise du système ce qu'il perd
  124. en ergonomie.
  125. \section{Lancement du terminal}
  126. \label{sec:lanc-du-term}
  127. \begin{enumerate}
  128. \item Sous Linux, il suffit de rechercher dans le menu une application
  129. nommée \emph{terminal} ou \emph{xterm} dans les \emph{outils
  130. système}.
  131. \item Sous MacOs, l'application s'appelle \emph{terminal}. Elle donne
  132. accès à un nombre limité de commandes.
  133. \item Sous Windows, il faut installer \emph{Cygwin} qui est disponible
  134. à l'adresse suivante: \url{https://cygwin.com}. Pour savoir comment
  135. faire:
  136. \begin{enumerate}
  137. \item \url{https://x.cygwin.com/docs/ug/setup.html} (en anglais)
  138. \item \url{http://migale.jouy.inra.fr/?q=fr/cygwin-install} (en
  139. français: dans ce document, il faut cependant sauter le point 10a)
  140. \end{enumerate}
  141. \end{enumerate}
  142. \chapter{Chemins d'accès et premières commandes}
  143. \label{cha:les-chemins-dacces}
  144. Les commandes portent le plus souvent sur des fichiers. Il est donc
  145. important, pour savoir où se trouvent les fichiers que vous voulez
  146. traiter, de connaître leur \emph{chemin d'accès}.
  147. \section{Chemins relatifs et absolus}
  148. \label{sec:chemins-relatifs-et}
  149. \paragraph{Le home directory}
  150. \label{sec:le-home-directory}
  151. Dans les systèmes Linux, tous vos fichiers se trouvent dans votre
  152. répertoire personnel, appelé le \emph{home directory}. Le nom de votre
  153. répertoire personnel est le même que celui de l'identifiant sous
  154. lequel vous vous êtes connecté. Par ailleurs, tous les répertoires des
  155. différents utilisateurs sont situés à la racine du disque dur dans un
  156. répertoire fondamental appelé \mintinline{text}{home}.
  157. Supposons que votre identifiant soit \mintinline{text}{jacques}; votre
  158. répertoire personnel sera donc:
  159. \begin{minted}{text}
  160. /home/jacques
  161. \end{minted}
  162. Obervez attentivement cette ligne. Vous remarquez que les noms des
  163. répertoires sont séparés par le caractère \mintinline{text}{/}. Cela
  164. veut dire que le signe \mintinline{text}{/} est utilisé pour indiquer
  165. que l'on passe d'un répertoire donné à l'un de ses
  166. sous-répertoires. Dans notre exemple, le répertoire
  167. \mintinline{text}{jacques} est donc inclus dans le répertoire
  168. \mintinline{text}{home}.
  169. Remarquez encore le \mintinline{text}{/} qui est placé \emph{devant}
  170. \mintinline{text}{home}: comme il n'est lui-même précédé de rien, il
  171. indique que le répertoire \mintinline{text}{home} est placé \emph{à la
  172. racine du disque dur}.
  173. \paragraph{Definition: chemins absolus, chemins relatifs}
  174. \label{sec:chem-absol-chem}
  175. Un chemin d'accès est dit \emph{absolu} quand il est donné à partir de
  176. la racine du disque dur. Il est \emph{relatif} quand il est donné à
  177. partir de tout autre endroit du disque dur. Soit par exemple le
  178. répertoire \mintinline{text}{travail} créé par l'utilisateur
  179. \mintinline{text}{jacques} dans son répertoire personnel. À partir de
  180. ce répertoire, le chemin d'accès absolu sera
  181. \begin{minted}{text}
  182. /home/jacques/travail/
  183. \end{minted}
  184. tandis que le chemin relatif sera
  185. \begin{minted}{text}
  186. travail/
  187. \end{minted}
  188. Corrolaire: tout chemin d'accès absolu commence nécessairement par le
  189. caractère \mintinline{text}{/}; quand ce n'est pas le cas, le chemin
  190. d'accès est nécessairement relatif.
  191. \paragraph{Conventions}
  192. \label{sec:conventions}
  193. Il existe un grand nombre de raccourcis ou de signes conventionnels
  194. qui sont utilisés dans la ligne de commande. On en retiendra trois
  195. pour le moment:
  196. \begin{itemize}
  197. \item \emph{home directory}: depuis tout endroit du disque dur, tout
  198. utilisateur peut accéder à son répertoire personnel par le raccourci
  199. \begin{minted}{text}
  200. ~/
  201. \end{minted}
  202. Ainsi, pour l'utilisateur \mintinline{text}{jacques},
  203. \mintinline{text}{~/travail} est l'équivalent de \\
  204. \mintinline{text}{/home/jacques/travail}.
  205. \item \label{ref:parent-current}répertoire parent: quel que soit le
  206. répetoire dans lequel on se trouve, la séquence
  207. \mintinline{text}{..} désigne le \emph{répertoire parent},
  208. c'est-à-dire le répertoire qui le contient, ou bien qui est situé au
  209. niveau supérieur dans l'arborescence du disque dur. Par exemple, à
  210. partir du répertoire \mintinline{text}{/home/jacques/travail},
  211. \mintinline{text}{..} désigne le répertoire
  212. \mintinline{text}{/home/jacques}.
  213. \item répertoire courant: Quant au signe \og\mintinline{text}{.}\fg,
  214. il désigne tout simplement le répertoire dans lequel on se trouve.
  215. \end{itemize}
  216. \section{Premières commandes}
  217. \label{sec:prem-comm}
  218. \paragraph{pwd}
  219. \label{sec:pwd}\commande*{pwd}
  220. Signifie \emph{print working directory}. Cette commande vous retourne
  221. tout simplement le chemin d'accès absolu du répertoire dans lequel
  222. vous vous trouvez. Très utile pour ne pas se perdre! Exemple:
  223. \begin{minted}{text}
  224. [robert@kiddo ~]$ pwd
  225. /home/robert
  226. \end{minted}
  227. \begin{quoting}\footnotesize
  228. La séquence \mintinline{text}+[robert@kiddo ~]$+ est \emph{l'invite
  229. de commande} (anglais \emph{prompt}). C'est à la suite de cette
  230. invite que l'on entre les commandes. Nous y reviendrons. Observez
  231. pour le moment quelques unes des informations données par cette
  232. invite: l'utilisateur \mintinline{text}{robert} est connecté sur
  233. l'ordinateur \mintinline{text}{kiddo}; ensuite, le signe
  234. \mintinline{text}+~+ indique qu'il se trouve dans son \emph{home
  235. directory}, ce que retourne en effet la commande
  236. \mintinline{text}+pwd+ qui a été entrée ici. Enfin, le signe
  237. \mintinline{text}|$| indique que l'utilisateur
  238. \mintinline{text}|robert| n'est pas l'administrateur du système. En
  239. effet, le \emph{prompt} de l'administrateur du système, que l'on
  240. appelle \emph{root}, se termine par le signe
  241. \mintinline{text}|#|. Exemple:
  242. \begin{minted}{text}
  243. [root@kiddo ~]# pwd
  244. /root
  245. [root@kiddo ~]#
  246. \end{minted}
  247. Remarquez que le \emph{home directory} de l'utilisateur
  248. \mintinline{text}|root| n'est pas situé dans le répertoire
  249. \mintinline{text}|/home| qui est réservé aux utilisateurs non
  250. privilégiés.
  251. \end{quoting}
  252. \paragraph{mv}
  253. \label{sec:mv}\commande*{mv}
  254. Signifie \emph{move}. Cette commande déplace les fichiers d'un endroit
  255. vers un autre. La syntaxe est la suivante:
  256. \begin{minted}[showspaces]{text}
  257. mv <source> <destination>
  258. \end{minted}
  259. \begin{quoting}\footnotesize
  260. Par convention, le signe \verb*+ + marque l'espace.
  261. \end{quoting}
  262. Exemple: déplacement du fichier \mintinline{text}{trachiniennes.pdf}
  263. dans le répertoire \mintinline{text}{travail}:
  264. \begin{minted}{text}
  265. [robert@kiddo ~]$ mv trachiniennes.pdf travail/
  266. \end{minted}
  267. Déplacement du fichier \mintinline{text}{trachiniennes.pdf} depuis le
  268. répertoire \mintinline{text}{travail} vers le répertoire courant
  269. (désigné par le raccourci \mintinline{text}|.|):
  270. \begin{minted}{text}
  271. [robert@kiddo ~]$ mv travail/trachiniennes.pdf .
  272. \end{minted}
  273. Déplacement avec indication des chemins absolus:
  274. \begin{minted}{text}
  275. [robert@kiddo ~]$ mv /home/robert/trachiniennes.pdf /home/robert/travail/
  276. \end{minted}
  277. Utilisation de raccourcis:
  278. \begin{minted}{text}
  279. [robert@kiddo ~]$ mv ~/trachiniennes.pdf ~/travail/
  280. \end{minted}
  281. \paragraph{cp}
  282. \label{sec:cp}\commande*{cp}
  283. Signifie \emph{copy}. Cette commande copie des fichiers depuis un
  284. endroit vers un autre. La syntaxe est comparable à celle de la
  285. séquence \commande{mv}\mintinline{text}{mv}.
  286. \begin{minted}[showspaces]{text}
  287. cp <source> <destination>
  288. \end{minted}
  289. Exemple: copie du fichier \mintinline{text}{trachiniennes.pdf} dans le
  290. répertoire \mintinline{text}{travail}:
  291. \begin{minted}{text}
  292. [robert@kiddo ~]$ cp trachiniennes.pdf travail/
  293. \end{minted}
  294. Copie du fichier \mintinline{text}{trachiniennes.pdf} depuis le
  295. répertoire \mintinline{text}{travail} vers le répertoire courant
  296. (désigné par le raccourci \mintinline{text}|.|):
  297. \begin{minted}{text}
  298. [robert@kiddo ~]$ cp travail/trachiniennes.pdf .
  299. \end{minted}
  300. Copie avec indication des chemins absolus:
  301. \begin{minted}{text}
  302. [robert@kiddo ~]$ cp /home/robert/trachiniennes.pdf /home/robert/travail/
  303. \end{minted}
  304. Utilisation de raccourcis:
  305. \begin{minted}{text}
  306. [robert@kiddo ~]$ cp ~/trachiniennes.pdf ~/travail/
  307. \end{minted}
  308. \paragraph{cd}
  309. \label{sec:cd}\commande*{cd}
  310. Signifie \emph{change directory}. Permet de changer de répertoire
  311. courant, par exemple pour travailler sur les fichiers d'un répertoire
  312. différent de son \emph{home directory}. La syntaxe est la suivante:
  313. \begin{minted}[showspaces]{text}
  314. cd <chemin_d'accès_du_nouveau_répertoire>
  315. \end{minted}
  316. Exemple: changement vers le répertoire \mintinline{text}|/usr/bin|:
  317. \begin{minted}{text}
  318. [robert@kiddo ~]$ cd /usr/bin
  319. [robert@kiddo /usr/bin]$
  320. \end{minted}
  321. \begin{quoting}\footnotesize
  322. Remarquez le changement de l'invite après l'exécution de la
  323. commande. L'invite nous donne l'indication du nouveau répertoire.
  324. \end{quoting}
  325. Confirmation par la commande \commande{pwd}\mintinline{text}{pwd}:
  326. \begin{minted}{text}
  327. [robert@kiddo /usr/bin]$ pwd
  328. /usr/bin
  329. [robert@kiddo /usr/bin]$
  330. \end{minted}
  331. \begin{quoting}\footnotesize
  332. NB: la commande \mintinline{text}{cd} seule fait revenir l'utilisateur
  333. directement dans son \emph{home directory}.
  334. \end{quoting}
  335. \paragraph{ls}
  336. \label{sec:ls}\commande*{ls}[(]
  337. Signifie \emph{list}. Affiche à l'écran tous les fichiers et les
  338. répertoires contenus dans un répertoire donné. Si on ne précise pas le
  339. répertoire dont il faut lister les fichiers, la commande liste les
  340. fichiers du répertoire courant. Exemple: on vérifie que le fichier
  341. \mintinline{text}{trachiniennes.pdf} se trouve bien dans le répertoire
  342. travail:
  343. \begin{minted}{text}
  344. [robert@kiddo ~]$ ls travail/
  345. trachiniennes.pdf
  346. \end{minted}
  347. \begin{quoting}\footnotesize
  348. Comme on le voit, la commande retourne le nom du seul fichier qui se
  349. trouve dans le répertoire \mintinline{text}{travail}.\\
  350. La commande \mintinline{text}{ls} est l'une des plus importantes;
  351. elle admet de nombreuses options que nous détaillerons plus loin
  352. dans ce cours.
  353. \end{quoting}
  354. \section{Options}
  355. \label{sec:options}
  356. On a donné plus haut l'exemple de la commande \mintinline{text}|ls|
  357. qui affiche à l'écran tous les fichiers contenus dans un répertoire
  358. donné. Voici ce que retourne cette commande lancée sur notre dépôt
  359. Git:
  360. \begin{minted}{text}
  361. [robert@kiddo courses]$ ls
  362. fichiers ls-R makefile _preamble.tex README.md README.pdf README.tex texfiles
  363. \end{minted}
  364. Mais on peut souhaiter recueillir davantage d'informations. Par
  365. exemple, dans la liste ci-dessus, on ne peut pas distinguer les
  366. fichiers des répertoires. Heureusement, les commandes peuvent recevoir
  367. des \emph{options}. Celles-ci sont de deux types:
  368. \begin{enumerate}
  369. \item Les options \enquote{longues}, qui sont préfixées par
  370. \mintinline{text}|--| et suivies de noms entiers.
  371. \item Les options \enquote{courtes}, qui sont préfixées par
  372. \mintinline{text}|-| et suivies d'abréviations.
  373. \end{enumerate}
  374. Voici donc ce que donne la même commande \mintinline{text}|ls|, suivie
  375. de l'option \mintinline{text}|-l| pour \enquote{use a \ul{l}ong
  376. listing format} et de l'option \mintinline{text}|--color|:
  377. \begin{minted}[escapeinside=||,linenos]{text}
  378. [robert@kiddo courses]$ ls -l --color
  379. total 56
  380. drwxr-xr-x 3 robert robert 4096 12 sept. 21:52 |\textcolor{blue}{fichiers}|
  381. -rw-r--r-- 1 robert robert 88 12 sept. 20:57 ls-R
  382. -rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile
  383. -rw-r--r-- 1 robert robert 558 12 sept. 11:20 _preamble.tex
  384. -rw-r--r-- 1 robert robert 1254 12 sept. 20:57 README.md
  385. -rw-r--r-- 1 robert robert 27345 12 sept. 20:58 README.pdf
  386. -rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
  387. -rw-r--r-- 1 robert robert 49 12 sept. 20:57 texfiles
  388. \end{minted}
  389. \begin{quoting}
  390. \textbf{Remarque} L'option \mintinline{text}|--color| permet de
  391. distinguer facilement les fichiers et les répertoires.
  392. \end{quoting}
  393. \paragraph{Commentaire}
  394. \label{ref:file-system-blocks}
  395. L'option \mintinline{text}|-l|, \enquote{long listing format}, affiche
  396. d'abord sur la première ligne la somme des \emph{file system blocks}
  397. occupés par les fichiers qui sont listés\footnote{Le \emph{file system
  398. block} est la plus petite unité d'écriture possible sur un sytème
  399. de fichiers donné.}. Les fichiers et les répertoires sont ensuite
  400. donnés dans les lignes suivantes. Prenons comme exemple la ligne~4
  401. ci-dessus:
  402. \begin{minted}{text}
  403. -rw-r--r-- 1 robert robert 88 12 sept. 20:57 ls-R
  404. \end{minted}
  405. Il faut l'analyser en dix parties, de la façon suivante:
  406. \bgroup\ttfamily
  407. \begin{xltabular}{1.0\linewidth}{XXXXXXXXXX}
  408. \toprule
  409. 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\ \midrule\endhead
  410. - & rw- & r-- & r-- & 1 & robert & robert & 88 & 12 sept. 20:57 &
  411. ls-R
  412. \\
  413. \bottomrule
  414. \end{xltabular}
  415. \egroup
  416. Voici une analyse simplifiée de cette ligne. Retenez que d'autres
  417. valeurs que celles qui sont commentées ci-dessous sont possibles.
  418. \begin{enumerate}
  419. \item Peut avoir les valeurs suivantes:
  420. \begin{itemize}
  421. \item \mintinline{text}|-| pour les fichiers;
  422. \item \mintinline{text}|d| pour les répertoires;
  423. \item \mintinline{text}|l| pour les liens.
  424. \end{itemize}
  425. \item \hypertarget{lnk_permissions}{Permissions} données au
  426. propriétaire. Il y a trois types de permissions que vous devez
  427. connaître ici:
  428. \begin{itemize}
  429. \item \mintinline{text}|-|: aucune permission;
  430. \item \mintinline{text}|r|: permission en lecture;
  431. \item \mintinline{text}|w|: permission en écriture;
  432. \item \mintinline{text}|x|: permission en exécution.
  433. \end{itemize}
  434. La première position représente les droits en \emph{lecture}
  435. (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|r|);
  436. La deuxième position représente les droits en \emph{écriture}
  437. (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|w|);
  438. La troisième position représente les droits en \emph{exécution}
  439. (valeurs possibles: \mintinline{text}|-| ou \mintinline{text}|x|).
  440. \item Permission de \emph{groupe}. Les groupes peuvent réunir
  441. plusieurs utilisateurs. Par exemple, on peut créer un groupe
  442. \emph{travail} et y mettre plusieurs utilisateurs qui auront ainsi
  443. des permissions communes sur les fichiers et les répertoires.
  444. \item Permissions données à tout le monde.
  445. \item Le nombre de liens sur le fichier ou le répertoire listé. Un
  446. fichier a en principe au moins un lien tandis qu'un répertoire en a
  447. au moins deux car le système considère que le répertoire parent et
  448. le répertoire courant (\mintinline{text}|..| et
  449. \mintinline{text}|.|, voir \emph{supra}
  450. \vref{ref:parent-current}) sont des liens.
  451. \item Le nom du propriétaire du fichier.
  452. \item Le nom du groupe dont les membres peuvent avoir des permissions
  453. sur le fichier.
  454. \item La taille du fichier mesurée en \emph{bytes}\footnote{Le
  455. \emph{byte} est une séquence de 8 \emph{bits} traitée comme une
  456. seule unité d'information. Le \emph{bit} de données peut avoir deux
  457. valeurs: 0 ou 1, ce nous qui rappelle que les ordinateurs sont des
  458. machines électriques dans lesquelles le courant peut passer (1) ou
  459. ne pas passer (0). L'unité conventionnelle du \emph{bit} est
  460. \unit{b} tandis que l'unité du \emph{byte} est \unit{B}. Il ne
  461. faut pas les confondre.}.
  462. \item La date à laquelle le fichier a été créé ou modifié pour la
  463. dernière fois.
  464. \item Le nom du fichier.
  465. \end{enumerate}
  466. \commande*{ls}[)]
  467. \chapter{Bash, le shell}
  468. \label{cha:bash-le-shell}
  469. Ce que vous montre le terminal, à savoir l'invite de commande ou
  470. \emph{prompt} en anglais, s'appelle le \emph{shell}. Il y a plusieurs
  471. types de \emph{shells}, mais le plus connu s'appelle
  472. \emph{bash}\footnote{Pour \emph{bourne again
  473. shell}.}. La~\vref{sec:prem-comm} vous a appris une première série
  474. de commandes.
  475. Les commandes portent sur les \emph{fichiers}. Avant de continuer, il
  476. faut savoir que sous Linux \emph{tout est fichier}: un fichier texte
  477. est un fichier, mais un répertoire aussi, de même que le clavier,
  478. l'écran et tous les périphériques de l'ordinateur sont des
  479. fichiers. Ainsi, un programme vidéo qui joue un film ne fait pas autre
  480. chose que copier des séquences vidéo vers le fichier qui désigne
  481. l'écran et des séquences son vers le fichier qui désigne la carte
  482. son.
  483. La deuxième chose à savoir est que Linux est un système dit \emph{sans
  484. extension}. L'\emph{extension} est une séquence de 1 à 4 caractères
  485. placée après un point dans un nom de fichier. Elle permet de connaître
  486. quel est le type de chaque fichier. Par exemple, c'est par l'extension
  487. que l'on saura que \verb+fichier.png+ est un fichier image.
  488. À la différence d'autres systèmes informatiques, Linux ne fait aucun
  489. cas de l'extension mais regarde directement à l'intérieur de chaque
  490. fichier pour en déterminer le type.
  491. \paragraph{file}\commande*{file}
  492. La commande \mintinline{text}|file| permet de tout savoir sur les
  493. types de fichiers. Nous pouvons la lancer sur la racine de notre dépôt
  494. Git:
  495. \begin{minted}[linenos]{text}
  496. [robert@kiddo courses]$ file *
  497. fichiers: directory
  498. ls-R: ASCII text
  499. makefile: makefile script, ASCII text
  500. _preamble.tex: LaTeX 2e document, ASCII text
  501. README.md: UTF-8 Unicode text
  502. README.pdf: PDF document, version 1.5
  503. README.tex: LaTeX 2e document, UTF-8 Unicode text
  504. texfiles: ASCII text
  505. \end{minted}
  506. \begin{quoting}
  507. \textbf{Remarques:}
  508. \begin{enumerate}
  509. \item Les éléments des lignes 2, 3, 4 et 9 n'ont pas d'extension
  510. mais Linux détermine leur type de façon précise.
  511. \item À la suite de la commande \mintinline{text}|file|, le
  512. caractère \mintinline{text}|*| a une signification spéciale: il
  513. désigne toute séquence formée par zéro ou plus de caractères: on
  514. l'a utilisé ici pour lister tous les fichiers du répertoire
  515. courant (v. \emph{infra} \vref{sec:wildcards} pour plus de
  516. détails).
  517. \end{enumerate}
  518. \end{quoting}
  519. \paragraph{Minuscules et majuscules}
  520. À savoir également: Linux est sensible à la casse dans les noms des
  521. fichiers. Ainsi, \verb+fichier.txt+ et \verb+Fichier.txt+ sont deux
  522. fichiers différents.
  523. \paragraph{Espaces}
  524. Soit la commande suivante:
  525. \begin{minted}{text}
  526. [robert@kiddo courses]$ ls -l README.md README.pdf
  527. -rw-r--r-- 1 robert robert 1254 13 sept. 08:14 README.md
  528. -rw-r--r-- 1 robert robert 27345 13 sept. 08:15 README.pdf
  529. \end{minted}
  530. Comme on l'a vu plus haut (\vref{sec:options}), le \emph{shell} n'a
  531. pas de mal à distinguer l'\emph{option courte} des \emph{arguments}
  532. car à la différence des arguments, l'option est préfixée par le signe
  533. \mintinline{text}|-|. La commande est donc interprétée de la façon
  534. suivante: \enquote{veuillez donner des informations au \emph{format
  535. long} sur les deux fichiers \texttt{README.md} et
  536. \texttt{README.pdf}}.
  537. C'est donc l'\emph{espace} qui sert à délimiter les options et les
  538. arguments dans les commandes du \emph{shell}. Techniquement, comme
  539. l'espace est interprété comme un délimiteur, on dit que c'est un
  540. \emph{caractère actif} du \emph{shell}. Ainsi, dans une ligne de
  541. commande, un fichier nommé \verb+photos de vacances.zip+ sera
  542. interprété comme une suite distincte de trois arguments:
  543. \begin{enumerate}
  544. \item \verb+photos+
  545. \item \verb+de+
  546. \item \verb+vacances.zip+
  547. \end{enumerate}
  548. Et le \emph{shell} ne pourra pas le trouver. Il y a deux solutions
  549. possibles:
  550. \begin{enumerate}\label{ref:guillemets-simples-intro}
  551. \item Placer le nom du fichier entre
  552. \hypertarget{lnk_guillemets}{guillemets} simples:
  553. \begin{minted}{text}
  554. [robert@kiddo courses]$ ls 'photos de vacances.zip'
  555. 'photos de vacances.zip'
  556. \end{minted}
  557. \item Préfixer les espaces par ce qu'on appelle l'\emph{escape
  558. character} qui est le \emph{backslash} (\verb+\+)
  559. \begin{minted}{text}
  560. [robert@kiddo courses]$ ls photos\ de\ vacances.zip
  561. 'photos de vacances.zip'
  562. \end{minted}
  563. Le rôle du caractère d'échappement est en effet d'annuler la
  564. signification particulière du caractère qui le suit. Or dans le
  565. \emph{shell}, l'espace est un \emph{caractère actif} puisqu'il est
  566. le délimiteur entre les commandes, les options et les arguments.
  567. \end{enumerate}
  568. \begin{quoting}
  569. On comprendra qu'il vaut mieux éviter d'utiliser les espaces dans
  570. les noms des fichiers. À la place des espaces, on utilisera le
  571. caractère de soulignement ou \emph{underscore}:
  572. \verb+photos_de_vacances.zip+
  573. \end{quoting}
  574. \paragraph[Fichiers cachés]{\hypertarget{lnk_hidden}{Fichiers cachés}}
  575. Tout fichier dont le nom commence par un point (\mintinline{text}|.|)
  576. est considéré comme un fichier caché. Le plus souvent, les fichiers
  577. cachés contiennent des paramètres de configuration. La commande
  578. \commande{ls}\mintinline{text}|ls| est capable de les afficher si
  579. on lui passe l'option \mintinline{text}|-a| pour
  580. \emph{all}. Appliquons cette option sur notre dépôt Git:
  581. \begin{minted}[escapeinside=||,linenos]{text}
  582. [robert@kiddo courses]$ ls -la
  583. total 72
  584. drwxr-xr-x 4 robert robert 4096 13 sept. 12:44 .
  585. drwxr-xr-x 6 robert robert 4096 10 sept. 11:04 ..
  586. drwxr-xr-x 3 robert robert 4096 13 sept. 12:44 |\textcolor{blue}{fichiers}|
  587. drwxr-xr-x 8 robert robert 4096 13 sept. 11:29 |\textcolor{blue}{.git}|
  588. -rw-r--r-- 1 robert robert 19 1 août 2017 .gitignore
  589. -rw-r--r-- 1 robert robert 88 13 sept. 08:14 ls-R
  590. -rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile
  591. -rw-r--r-- 1 robert robert 588 13 sept. 11:29 _preamble.tex
  592. -rw-r--r-- 1 robert robert 1254 13 sept. 08:14 README.md
  593. -rw-r--r-- 1 robert robert 27345 13 sept. 08:15 README.pdf
  594. -rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
  595. -rw-r--r-- 1 robert robert 49 13 sept. 08:14 texfiles
  596. \end{minted}
  597. Nous voyons ainsi apparaître à la ligne~6 un répertoire caché et à la
  598. ligne~7 un fichier caché.
  599. \section{Commandes courantes}
  600. \label{sec:commandes-courantes}
  601. Ces commandes s'ajoutent à celles qui sont décrites plus haut
  602. (\vref{sec:prem-comm}).
  603. \paragraph{mkdir}\commande*{mkdir}
  604. Sert à créer un nouveau répertoire. L'option \mintinline{text}|-p|
  605. peut-être utilisée si l'on veut créer d'un coup un répertoire et un ou
  606. plusieurs sous-répertoires. L'option \mintinline{text}|-v|, pour
  607. \emph{verbose}, demande aussi à \verb|mkdir| de retourner un message
  608. de confirmation:
  609. \begin{minted}{text}
  610. [robert@kiddo courses]$ mkdir -pv sandbox/robert
  611. mkdir: création du répertoire 'sandbox'
  612. mkdir: création du répertoire 'sandbox/robert'
  613. \end{minted}
  614. \paragraph{touch}\commande*{touch}
  615. Sert à créer un fichier vide dont le nom est passé en argument. Cette
  616. commande sert également à modifier les métadonnées de temps associées
  617. aux fichiers (date de création et/ou de modification).
  618. L'exemple suivant montre comment créer un nouveau dossier dans lequel
  619. on crée également un fichier vide \verb|fichier.txt|. Ensuite, on
  620. utilise la commande \commande{mv}\verb|mv| pour \emph{déplacer} ce
  621. fichier vers un autre fichier \verb|fichier-mk2.txt| au même
  622. endroit. Le résultat de cette action particulière, le
  623. \emph{déplacement au même endroit}, est tout simplement de renommer le
  624. fichier. Enfin, la commande %
  625. \commande{ls}\verb|ls -l| sert de moyen de contrôle:
  626. \begin{minted}{text}
  627. [robert@kiddo courses]$ mkdir -pv sandbox
  628. mkdir: création du répertoire 'sandbox'
  629. [robert@kiddo courses]$ touch sandbox/fichier.txt
  630. [robert@kiddo courses]$ mv sandbox/fichier.txt sandbox/fichier-mk2.txt
  631. [robert@kiddo courses]$ ls -l sandbox/
  632. total 0
  633. -rw-r--r-- 1 robert robert 0 13 sept. 15:51 fichier-mk2.txt
  634. \end{minted}
  635. \subsection{Commandes destructives}
  636. \label{sec:comm-destr}
  637. \paragraph{rm}\commande*{rm}
  638. Pour \emph{remove}. Il suffit de passer en argument à cette commande
  639. ce que l'on souhaite détruire. Par défaut, cette commande ne détruit
  640. pas les répertoires. Elle accepte une série d'options dont voici les
  641. plus importantes:
  642. \begin{description}
  643. \item[-i] demande une confirmation à chaque opération de destruction.
  644. \item[-f] pour \emph{force}; fait le contraire de \verb|-i|.
  645. \item[-r] pour \emph{recursive}; détruit les répertoires et leur
  646. contenu.
  647. \end{description}
  648. \begin{mdframed}[backgroundcolor=Cyan]
  649. Cette commande doit être exécutée avec précaution car il n'y a aucun
  650. retour en arrière possible.
  651. \end{mdframed}
  652. Par exemple, soit le répertoire \verb|sandbox|. La commande:
  653. \begin{minted}{text}
  654. [robert@kiddo courses]$ rm -rf sandbox
  655. \end{minted}
  656. détruira sans aucune demande de confirmation à la fois le répertoire
  657. \verb|sandbox| et tout ce qu'il contient, fichiers, répertoires et
  658. sous-répertoires.
  659. Pour donner une idée de la puissance de destruction de cette commande,
  660. la ligne suivante:
  661. \begin{minted}{text}
  662. [robert@kiddo courses]$ rm -rf *
  663. \end{minted}
  664. détruira absolument tout sans demande de confirmation pour ne laisser
  665. que les fichiers cachés du répertoire courant dont le nom commence
  666. par un point.
  667. \section[Wildcards]{\hypertarget{lnk_wildcards}{Wildcards}}
  668. \label{sec:wildcards}
  669. Les \emph{wildcards}, ou \enquote{métacaractères} sont des caractères
  670. ou des séquences de caractères qui servent à représenter des séries de
  671. caractères. On les utilise pour construire des schémas de
  672. remplacement. Voici quels sont les plus utilisés:
  673. \begin{itemize}
  674. \item \verb|*| représente zéro ou plus de caractères.
  675. \item \verb|?| représente un caractère unique.
  676. \item \verb|[]| représente une série de caractères. Par exemple,
  677. \verb|[QGH]| représente l'une des trois lettres majuscules Q, G ou
  678. H. Ainsi, la commande:
  679. \begin{minted}{text}
  680. ls [QGH]*
  681. \end{minted}
  682. retournera tous les noms de fichiers qui commencent par l'une de ces
  683. trois lettres. Pour représenter une \emph{série continue de
  684. caractères}, on peut utiliser le trait d'union. Par exemple,
  685. \verb|[a-z]| représente toutes les lettres minuscules non accentuées
  686. de l'alphabet; et \verb|[A-Za-z]| toutes les lettres non accentuées,
  687. majuscules ou minuscules.
  688. \end{itemize}
  689. \section[Redirection et
  690. chaînage]{\hypertarget{lnk_redirection}{Redirection}
  691. et chaînage}
  692. \label{sec:redir-et-chain}
  693. Nous avons vu jusqu'ici que les commandes renvoient normalement leur
  694. résultat sur le terminal lui-même. On peut cependant rediriger ce que
  695. les commandes renvoient vers un fichier à l'aide des \emph{opérateurs
  696. de redirection}. Trois d'entre eux sont utiles à connaître:
  697. \begin{enumerate}
  698. \item \verb|>| redirige vers un nouveau fichier. Si le fichier
  699. n'existe pas, il est créé. S'il existe, il sera écrasé et remplacé
  700. par un nouveau fichier du même nom.
  701. \item \verb|>>| fait la même chose que \verb|>|, mais \emph{ajoute} le
  702. résultat au fichier si celui-ci existe.
  703. \item \verb|<| lit le contenu du fichier dont le nom suit et le passe
  704. en argument à la commande qui précède pour traitement.
  705. \end{enumerate}
  706. Dans l'exemple qui suit, on demande à la commande
  707. \commande{ls}\verb|ls -l| de rediriger son résultat vers un fichier
  708. \verb|all-files.txt|. On s'assure que ce fichier a bien été créé, puis
  709. on demande à la commande \commande{cat}\verb|cat| d'en afficher le
  710. contenu au terminal. Les trois commandes sont entrées aux lignes 1, 2
  711. et 4:
  712. \begin{minted}[escapeinside=||,linenos]{text}
  713. [robert@kiddo courses]$ ls -l > |\textcolor{red}{all-files.txt}|
  714. [robert@kiddo courses]$ ls
  715. |\textcolor{red}{all-files.txt}| fichiers ls-R makefile _preamble.tex README.md README.tex
  716. [robert@kiddo courses]$ cat |\textcolor{red}{all-files.txt}|
  717. total 24
  718. drwxr-xr-x 3 robert robert 4096 13 sept. 17:15 fichiers
  719. -rw-r--r-- 1 robert robert 88 13 sept. 13:34 ls-R
  720. -rw-r--r-- 1 robert robert 627 12 sept. 15:11 makefile
  721. -rw-r--r-- 1 robert robert 668 13 sept. 15:26 _preamble.tex
  722. -rw-r--r-- 1 robert robert 1254 13 sept. 13:34 README.md
  723. -rw-r--r-- 1 robert robert 1570 12 sept. 12:13 README.tex
  724. \end{minted}
  725. \label{ref:wc-intro}
  726. L'exemple suivant est plus subtil. Il fait appel à une commande,
  727. \verb|wc -l| qui compte les lignes des fichiers\footnote{Voir plus
  728. loin \vpageref{ref:wc}.}:
  729. \begin{minted}[linenos]{text}
  730. [robert@kiddo courses]$ wc -l makefile
  731. 21 makefile
  732. [robert@kiddo courses]$ wc -l < makefile
  733. 21
  734. \end{minted}
  735. Comme on le voit, la commande entrée à la ligne~1 renvoie deux
  736. informations: le nombre de lignes du fichier (21) et le nom du fichier
  737. lui-même. Quant à la commande de la ligne~3, elle utilise l'opérateur
  738. de redirection \verb|<| qui a pour effet de passer en argument à la
  739. commande non pas un nom de fichier à traiter, mais son contenu seul,
  740. lu puis redirigé. C'est une variante anonyme de la commande de la
  741. ligne~1.
  742. \paragraph{Chaînage}
  743. En anglais, \emph{piping}. Comme nous l'avons vu, la redirection
  744. permet d'envoyer des résultats vers des fichiers ou bien des contenus
  745. de fichiers vers des commandes. Le \emph{chaînage} consiste à faire
  746. passer un résultat fourni par une commande à une autre commande censée
  747. en fournir un nouveau traitement. L'opérateur de chaînage est le
  748. caractère \emph{pipe} (\verb+|+).
  749. Avant d'aller plus loin, étudions rapidement deux nouvelles commandes
  750. qui servent à filtrer le contenu des fichiers.
  751. \paragraph{head}\label{ref:head-tail}\commande*{head}
  752. \mintinline{text}|head -<num> fichier| affiche au terminal les
  753. \verb|<num>| premières lignes d'un fichier. Sans l'option
  754. \mintinline{text}|-<num>|, les 10 premières lignes sont
  755. affichées. Exemple:
  756. \begin{minted}{text}
  757. [robert@kiddo courses]$ head -3 ls-R
  758. ./fichiers/01-ligne-de-commande.tex
  759. ./makefile
  760. ./_preamble.tex
  761. \end{minted}
  762. \paragraph{tail}\commande*{tail}
  763. \mintinline{text}|tail -<num> fichier| affiche au terminal les
  764. \verb|<num>| dernières lignes d'un fichier. Sans l'option
  765. \mintinline{text}|-<num>|, les 10 dernières lignes sont affichées.
  766. Exemple:
  767. \begin{minted}{text}
  768. [robert@kiddo courses]$ tail -3 ls-R
  769. ./_preamble.tex
  770. ./README.md
  771. ./README.tex
  772. \end{minted}
  773. En outre, on peut passer à \verb|tail| l'option %
  774. \mintinline{text}|-n +<num>| qui affiche tout un fichier jusqu'à la
  775. dernière ligne, \emph{mais en commençant à partir de la ligne}
  776. \verb|<num>|. L'exemple suivant en montre une application directe.
  777. Cet exemple reprend des commandes connues. Supposons que l'on veuille
  778. connaître simplement le nombre de fichiers du notre dépôt Git. Nous
  779. savons produire une liste à l'aide de la commande
  780. \commande{ls}\verb|ls -l|. Nous savons également que la commande
  781. \verb|wc -l| compte les lignes. Cependant, la première ligne retournée
  782. par la commande \verb|ls -l|, qui donne la somme des \emph{file system
  783. blocks} occupés par le contenu du répertoire, doit être exclue du
  784. compte (voir \emph{supra}, \vpageref{ref:file-system-blocks}). C'est
  785. ici qu'intervient la commande, \verb|tail|, qui retourne les dernières
  786. lignes d'un fichier. Avec l'option \verb|-n +2|, la première ligne
  787. sera ignorée:
  788. \begin{minted}{text}
  789. [robert@kiddo courses]$ ls -l | tail -n +2 | wc -l
  790. 6
  791. \end{minted}
  792. \section{Filtrage}
  793. \label{sec:filtrage}
  794. Comme leur nom l'indique, les commandes de filtrage servent à mettre
  795. en forme des fichiers texte tout en sélectionnant certaines parties de
  796. leur contenu.
  797. Nous en avons étudié deux plus haut (\vpageref{ref:head-tail}):
  798. \begin{enumerate}
  799. \item \commande{head}\verb|head| qui sélectionne les premières
  800. lignes d'un fichier.
  801. \item \commande{tail}\verb|tail| qui sélectionne les dernières
  802. lignes d'un fichier.
  803. \end{enumerate}
  804. On ajoutera ici les commandes suivantes:
  805. \paragraph{cat}\commande*{cat}
  806. Affiche au terminal tout le contenu d'un fichier:
  807. \begin{minted}{text}
  808. [robert@kiddo courses]$ cat ls-R
  809. ./fichiers/01-ligne-de-commande.tex
  810. ./makefile
  811. ./_preamble.tex
  812. ./README.md
  813. ./README.tex
  814. \end{minted}
  815. \paragraph{wc}\label{ref:wc}\commande*{wc}
  816. Pour \emph{word count}. Cette commande a été utilisée plus haut une
  817. fois avec l'option \verb|-l| pour compter les lignes d'un fichier
  818. (\vpageref{ref:wc-intro}). Utilisée sans option, elle retourne le
  819. nombre de lignes (\verb|-l|), de mots (\verb|-w|) et de caractères
  820. (\verb|-m|) d'un fichier:
  821. \begin{minted}{text}
  822. [robert@kiddo courses]$ wc makefile
  823. 21 114 627 makefile
  824. \end{minted}
  825. \paragraph{cut}\commande*{cut}
  826. Permet de mettre en forme des données. Prenons l'exemple du fichier
  827. suivant: \\ \mintinline{text}|etudiants.txt|
  828. \begin{minted}{text}
  829. Fonsec Sophie 123456 sophie.fonsec@quelquepart.net
  830. Pédot Hector 456789 hector.pedot@ailleurs.org
  831. \end{minted}
  832. Il contient sur chaque ligne un nom, un prénom, un matricule et une
  833. adresse email. Nous souhaitons collecter simplement les données
  834. suivantes:
  835. \begin{enumerate}
  836. \item Nom
  837. \item Prénom
  838. \item email
  839. \end{enumerate}
  840. La commande \verb|cut| peut être utilisée à cet effet avec les deux
  841. options suivantes:
  842. \begin{enumerate}
  843. \item \mintinline{text}|-d| indiquer par quel caractère les données
  844. sont délimitées (ici un espace).
  845. \item \mintinline{text}|-f| (pour \emph{field} en anglais) pour
  846. indiquer quelles données doivent être sélectionnées (ici, les
  847. éléments 1, puis 2, puis 4).
  848. \end{enumerate}
  849. \begin{minted}{text}
  850. [robert@kiddo courses]$ cut -d ' ' -f 2,1,4 etudiants.txt
  851. Fonsec Sophie sophie.fonsec@quelquepart.net
  852. Pédot Hector hector.pedot@ailleurs.org
  853. \end{minted}
  854. Mais comment faire pour modifier l'ordre des données et les mettre en
  855. forme de façon à placer le prénom avant le nom et avoir les adresses
  856. email entre crochets pointus? Comment faire aussi pour récupérer les
  857. données dans un tableur?
  858. \paragraph{awk}\commande*{awk}
  859. Ce programme accessible à la ligne de commande permet d'effectuer ce
  860. travail facilement. Il sélectionne les données dans l'ordre que l'on
  861. souhaite à l'aide de variables: \verb|$1|, \verb|$2|, \verb|$3|,
  862. \&c. Il effectue ensuite ce qu'on appelle des \emph{actions},
  863. lesquelles sont spécifiées entre accolades \verb|{}|. Nous allons ici
  864. utiliser l'action \verb|print|. Voici la commande:
  865. \begin{minted}{text}
  866. [robert@kiddo courses]$ awk '{print $2 ";" $1 ";<" $4 ">"}' etudiants.txt
  867. Sophie;Fonsec;<sophie.fonsec@quelquepart.net>
  868. Hector;Pédot;<hector.pedot@ailleurs.org>
  869. \end{minted}
  870. \begin{quoting}
  871. \textbf{Commentaire}
  872. \begin{enumerate}
  873. \item La totalité de l'argument passé à \verb|awk| a été placée
  874. entre guillemets simples \verb|' '|. On renvoie sur ce point à la
  875. règle posée \vpageref{ref:guillemets-simples-intro}.
  876. \item Entre les accolades, l'instruction \verb|print| accomplit
  877. successivement les tâches suivantes:
  878. \begin{enumerate}
  879. \item Impression du champ 2.
  880. \item Impression de la chaîne littérale \verb|;| placée entre
  881. guillemets\footnote{On n'aurait pas pu employer ici les
  882. guillemets simples car le premier guillemet simple aurait
  883. évidemment été compris comme le guillemet fermant celui qui se
  884. trouve juste avant l'accolade ouvrante.}.
  885. \item Impression du champ 1.
  886. \item Impression de la chaîne littérale \verb|;<| placée entre
  887. guillemets.
  888. \item Impression du champ 4.
  889. \item Impression de la chaîne littérale \verb|>| placée entre
  890. guillemets.
  891. \end{enumerate}
  892. \end{enumerate}
  893. \end{quoting}
  894. Pour terminer, il suffit de renommer le fichier \verb|etudiants.txt|
  895. en \verb|etudiants.csv| par la commande:\commande{mv}
  896. \begin{minted}{text}
  897. mv etudiants.txt etudiants.csv
  898. \end{minted}
  899. et de l'ouvrir dans LibreOffice Calc.
  900. \printindex[cmds]
  901. \end{document}