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