Contexte
Durée : 2h
Environnement de travail : Linux en ligne de commande
Pré-requis : Savoir gérer des fichiers et des utilisateurs sous Linux
Définition : CLI
Command Line Interface (interface en ligne de commande)
Pourquoi la ligne de commande ?
Pourquoi s'embêter à taper des commandes au lieu de cliquer sur des boutons ? Parce que c'est
Flexible : Combinaison de commandes et accès sans écran
Rapide : Plus économe en ressources, et rapide à utiliser (une fois pris en main)
Éducatif : Découvrir comment les choses fonctionnent vraiment
Puissant : Automatisation et scripting
C'est donc le couteau suisse de Linux !
Exemple : Une commande quotidiennement utile
fortune | cowsay | lolcat
Exemple : Un gestionnaire de Wifi en CLI ?
nmtui
Exemple : Mattermost en CLI !
matterhorn
Exemple : Lancer des robots voir des voitures autonomes !
Faites SY31 ou SY27 pour faire ce genre de folleries !
Rappels ou bases
Durée : 2h
Environnement de travail : Linux en ligne de commande
Les commandes de base en CLI
| Affiche le contenu d'un dossier |
| Change de dossier |
| Copie des fichiers |
| Renomme ou déplace des fichiers |
| Supprime des dossiers ou fichiers |
| Crée un dossier |
cat | Affiche le contenu d'un fichier |
Ce sont les commandes de base à retenir !
À noter que ces commandes de bases sont directement fournies par le shell et sont dites builtin.
Définition : Shell
C'est le programme qui interprète les commandes. On l'appelle shell car il forme une coquille autour du système d'exploitation.
C'est en fait une commande comme une autre, que vous pouvez lancer en tapant bash
, et quitter en tapant exit
(ou Ctrl+D pour les pros du clavier)
Organisation classique d'une commande
$ verbe --flag arguments ...
Le verbe reflète généralement bien ce que fait la commande (
ls
va par exemple lister le contenu du dossier par exemple).Les flags sont des options passée à la commande pour préciser comment on veut s'en servir (
-v
signifiera souvent verbose, ou "donne moi un max d'infos sur ce que tu fais", utile quand une commande ne fait pas ce qu'on veut...). Il en existe deux formes, longs(--verbose)
qui peuvent transmettre des idées complexes et courts (-v
) qui seront généralement des idées simples (activer une fonctionnalité particulière typiquement).Les arguments sont les chemins ou les données sur lesquels vont s'exécuter la commande.
Le nombre d'espaces entre les mots n'a aucune importance, du moment qu'ils séparent les différents éléments de la ligne.
Il existe souvent des flags pour rendre une commande récursive lorsqu'elle s'applique sur un dossier. Par exemple rm -r mon_dossier
supprimera mon_dossier et tout son contenu récursivement. Dans la même veine, mkdir -p chemin/vers/mon/dossier
créera tous les dossiers nécessaires pour arriver a ce chemin.
Manipuler des fichiers
Objectifs
Savoir utiliser la commande
grep
Savoir utiliser la commande
wc
Savoir utiliser la commande
sort
Méthode : grep
La commande grep
est l'une des plus utilisées sous Linux. Elle permet de rechercher un motif au sein de un ou plusieurs fichiers.
$ grep astrona /usr/share/dict/words
astronaut
astronaut's
astronautics
astronautics's
astronauts
La commande recherche dans le fichier /usr/share/dict/words
toutes les lignes qui contiennent la suite de lettre "astrona".
Exemple :
grep
peut aussi être utilisée sur un dossier entier, de manière récursive
$ grep -r astrona /usr/share/dict
/usr/share/dict/french:astronaute
/usr/share/dict/french:astronautes
/usr/share/dict/french:astronautique
/usr/share/dict/american-english:astronaut
/usr/share/dict/american-english:astronaut's
/usr/share/dict/american-english:astronautics
/usr/share/dict/american-english:astronautics's
/usr/share/dict/american-english:astronauts
On constate que, pour chaque occurrence qui est trouvée, il est précisé le nom du fichier dans lequel elle se trouve.
Exemple :
grep
est une commande puissante, qui peut aussi s'appuyer sur des expressions régulières.
$ grep "^anti-" /usr/share/dict/french
anti-américanisme
anti-impérialisme
anti-impérialiste
anti-impérialistes
anti-inflammatoire
anti-inflammatoires
anti-inflationniste
anti-inflationnistes
anti-scientifique
anti-sous-marin
Ici on ne capture que les occurrences qui commencent par "anti", c'est ce que signifie le caractère ^
. C'est ce que l'on appelle des expressions régulières. Cela mériterais un cours à part entière, pour approfondir, il existe de bonnes ressources en ligne.
Méthode : La commande wc
La commande wc
(pour Word Count) permet de compter, dans un fichier, le nombre de lignes, de mots et la taille du fichier.
$ wc lettre.tex
53 171 1510 lettre.tex
Dans l'ordre on récupère le nombre de lignes (53), le nombre de mots (171) et la taille (1510 octets) du fichier. Il est possible de n'obtenir qu'une seule de ces valeurs à l'aide d'options, par exemple -l
pour le nombre de lignes.
$ wc -l lettre.tex
53 lettre.tex
Méthode : La commande sort
Une autre commande très utile est sort
. Comme son nom l'indique elle permet de retourner le contenu d'un fichier, mais trié.
sort /usr/share/dict/words
Par défaut elle trie par ordre alphabétique, mais il est possible de trier selon un ordre croissant numérique avec l'option -n
.
À retenir
On peut facilement effectuer des recherches avec grep
, du tri avec sort
et compter les lignes/mots d'un fichier avec wc
.
Appliquer la notion
On souhaite obtenir le nombre de mots qui contiennent la lettre w
en Français. Pour cela on s'aide du fichier /usr/share/dict/french
qui une liste de mots français. Elle est présente par défaut, sinon il est possible de l'installer avec la commande suivante :
sudo apt-get install wfrench
Obtenez le nombre de mot qui contiennent la lettre w
dans ce fichier.
On peut utiliser un fichier temporaire pour stocker les mots trouvés.
On commence par récupérer les mots qui contiennent un w
, en redirigeant le résultat dans un autre fichier.
$ grep "w" /usr/share/dict/french > mots_w.txt
Ensuite il suffit de compter le nombre de lignes dans ce fichier avec la commande wc
$ wc -l mots_w.txt
594 mots_w.txt
Les flux de redirections
Objectifs
Connaître les 3 canaux de communications (stdin, stdout, stderr)
Savoir rediriger les différents canaux d'une commande
Mise en situation
On a l'habitude d'utiliser des commandes qui retournent un résultat directement dans notre terminal. En réalité il est possible de rediriger ce résultat ailleurs, par exemple dans un fichier, en utilisant les différents canaux de communications d'une commande.
Définition : Sortie standard
La sortie standard d'un programme, que l'on nomme stdout
, est un flux qui va contenir tout ce qui est affiché à l'écran par la commande. Par défaut, cette sortie standard dirigée vers le terminal, pour que l'on puisse consulter le résultat de la commande.
Définition : Sortie d'erreurs
La sortie d'erreurs, que l'on nomme stderr
, est similaire à la sortie standard à la différence que ce flux est destiné aux erreurs renvoyés par la commande. Par défaut cette sortie est dirigée vers le terminal, et s'affiche donc en même temps que la sortie standard.
Flux de redirections
Les flux de redirections (ou simplement, redirections) sont des opérateurs qui permettent de diriger la sortie standard ou d'erreurs d'une commande vers une autre destination, en particulier vers un fichier.
Syntaxe :
Les opérateurs >
et >>
permettent de rediriger la sortie standard d'une commande dans un fichier :
>
efface complètement le contenu du fichier avant de rediriger le flux,>>
ajouter en fin de fichier la sortie standard.
Exemple : Opérateurs de redirection de stdin
On peut rediriger le résultat de la commande cat
.
$ cat TODO-perso.txt
- Faire les courses
- Déclarer mes impôts
- Réparer le pommeau de douche
$ cat TODO-boulot.txt
- Mettre en place les sauvegardes des postes
- Déployer le nouveau site web
- Poser les jours de congés de cet été
$ cat TODO-perso.txt TODO-boulot.txt > TODO.txt
$ cat TODO.txt
- Faire les courses
- Déclarer mes impôts
- Réparer le pommeau de douche
- Mettre en place les sauvegardes des postes
- Déployer le nouveau site web
- Poser les jours de congés de cet été
Ici on voit que les 2 fichiers contiennent du texte, la commande cat
a permis de les concaténer, et le résultat a été envoyé dans le fichier TODO.txt
(au lieu du terminal) grâce à l'opérateur >
.
Pour reproduire cet exemple téléchargez les fichiers suivants et placez-vous là où vous les avez téléchargé.
Exemple :
Si l'on reprend la commande cat
précédente, mais avec un fichier qui n'existe pas
$ cat TODO-perso.txt TODO-fauxfichier.txt > TODO.txt
cat: TODO-fauxfichier.txt: Aucun fichier ou dossier de ce type
$ cat TODO.txt
- Faire les courses
- Déclarer mes impôts
- Réparer le pommeau de douche
On constate que la sortie de la commande (pour le fichier qui existe bien) a été redirigée dans le fichier TODO.txt
, mais l'erreur pour le fichier n'existant pas s'affiche dans la console.
Méthode : Opérateurs de redirection de stderr
De la même manière que pour la sortie standard, la sortie d'erreurs peut-être redirigée à l'aide de deux opérateurs : 2>
et 2>>
.
$ cat TODO-perso.txt TODO-fauxfichier.txt > TODO.txt 2> erreur.txt
$ cat erreur.txt
cat: TODO-fauxfichier.txt: Aucun fichier ou dossier de ce type
Le fonctionnement est similaire à celui des redirections de stdin
, ici c'est le fichier erreur.txt
qui reçoit le flux d'erreurs. La différence entre 2>
et 2>>
est la même que entre >
et >>
.
Méthode : Fusionner les sorties
Il est aussi possible de rediriger stdin
et stderr
ensembles dans un même fichier. On utilise toujours >
ou >>
pour la sortie standard, et on se contente de rajouter l'opérateur 2>&1
pour indiquer de rediriger stderr
vers la même destination.
$ cat TODO-perso.txt TODO-fauxfichier.txt > TODO.txt 2>&1
$ cat TODO.txt
- Faire les courses
- Déclarer mes impôts
- Réparer le pommeau de douche
cat: TODO-fauxfichier.txt: Aucun fichier ou dossier de ce type
Définition : Entrée standard
L'entrée standard d'un programme, que l'on appelle stdin
, est le flux d'informations qu'il va recevoir en entrée. C'est l'inverse de la sortie standard.
Méthode : Redirection d'un fichier vers stdin
L'opérateur <
permet de rediriger le contenu d'un fichier sur l'entrée standard d'une commande. Par exemple la commande wc
permet de récupérer le nombre de lignes, de mots, et la taille en octets d'un contenu envoyé sur son entrée standard.
$ wc < TODO-perso.txt
3 14 76
Le contenu de TODO-perso.txt
a été envoyé sur l'entrée standard de wc
, qui compte ainsi 3 lignes, 14 mots et 76 octets.
À retenir
Chaque programme se voit attribuer 3 flux par le système d'exploitation : l'entrée standard (stdin
), la sortie standard (stdout
) et la sortie d'erreurs (stderr
). Par défaut les flux de sorties sont redirigés vers le terminal, mais des opérateurs de redirection permettent de diriger ces flux dans des fichiers.
Appliquer la notion
On souhaite lister le contenu de 3 dossiers de la machine dans un fichier files.txt
:
/etc/network/
(qui devrait exister)/var/lib/apt
(qui devrait exister)/etc/fake-folder
(qui ne devrait pas exister)
Le fichier files.txt
devra contenir uniquement la liste des fichiers, et les éventuelles erreurs doivent être écrites dans un fichier errors.txt
.
Donnez la commande pour réaliser cette opération.
On utilisera ls -l
et quelques redirections.
On utilise la commande ls -l
avec les 3 dossiers en paramètres pour lister le contenu des dossiers. L'opérateur >
permet de rediriger la sortie standard (donc la liste des fichiers) dans le fichier files.txt
tandis que l'opérateur 2>
redirige les erreurs dans le fichier errors.txt
.
ls -l /etc/network /var/lib/apt /etc/fake-folder > files.txt 2> errors.txt
On peut constater que le résultat a été correctement redirigé, et que l'erreur du dossier n'existant pas se trouve bien à part.
$ cat files.txt
/etc/network:
total 24
drwxr-xr-x 2 root root 4096 7 déc. 16:16 if-down.d
drwxr-xr-x 2 root root 4096 7 déc. 16:16 if-post-down.d
drwxr-xr-x 2 root root 4096 7 déc. 16:16 if-pre-up.d
drwxr-xr-x 2 root root 4096 7 déc. 16:16 if-up.d
-rw-r--r-- 1 root root 313 3 oct. 2016 interfaces
drwxr-xr-x 2 root root 4096 13 mars 2015 interfaces.d
lrwxrwxrwx 1 root root 12 26 nov. 2015 run -> /run/network
/var/lib/apt:
total 240
-rw-r--r-- 1 root root 269 26 nov. 2015 cdroms.list
-rw-r--r-- 1 root root 0 8 déc. 12:30 daily_lock
-rw-r--r-- 1 root root 188799 7 déc. 19:01 extended_states
-rw-r--r-- 1 root root 12288 7 déc. 16:14 listchanges.db
-rw-r--r-- 1 root root 12288 30 nov. 09:51 listchanges-old.db
drwxr-xr-x 4 root root 12288 7 déc. 16:36 lists
drwxr-xr-x 3 root root 4096 26 nov. 2015 mirrors
drwxr-xr-x 2 root root 4096 10 juin 2015 periodic
$ cat errors.txt
ls: impossible d'accéder à '/etc/fake-folder': Aucun fichier ou dossier de ce type
Chaîner les commandes
Objectifs
Comprendre ce qu'est un pipe
Savoir chaîner des commandes avec un pipe
Définition : Le pipe
Un pipe (tube ou tuyau en anglais) est un outil qui permet de connecter la sortie standard d'une commande avec l'entrée standard d'une autre commande. Cela permet de chaîner plusieurs commandes, le résultat de l'une formant les données d'entrée de la suivante.
Méthode : Utiliser un pipe
Pour créer un pipe entre 2 commandes, il suffit d'écrire les deux commandes séparées pour un caractère |
(que l'on appelle le pipe).
$ ls -R /home | less
La commande ls -R /home
liste tout les fichiers et dossiers de /home
de manière récursive, ce qui produit énormément de résultats dans le terminal. L'utilisation du pipe permet de rediriger la sortie standard vers la commande less
qui va nous permettre de naviguer dans le résultat de la commande (son stdin
donc).
Exemple : Filtrer des mots
La commande grep
permet de faire des recherches et/ou de filtrer du texte dans un fichier. Mais elle permet aussi de traiter un flux reçu sur son entrée standard.
$ ls -R /home | grep "picasoft"
/home/kyane/code/picasoft/registre:
/home/kyane/code/picasoft/stats-page:
/home/kyane/documents/picasoft/documents:
/home/kyane/documents/picasoft/api:
/home/kyane/documents/picasoft/doc:
Ici on récupère la liste des fichiers, mais on filtre toutes les lignes qui contiennent le texte "picasoft". Grâce au pipe la commande grep
travaille directement sur le résultat de la commande ls
.
À retenir
Il est possible de créer un pipe, un tuyau, entre la sortie standard d'une commande et l'entrée standard d'une autre commande, à l'aide du caractère |
.
Appliquer la notion
On pourra s'appuyer sur la commande cut
qui permet de découper chaque ligne d'un fichier selon un délimiteur précis et de restituer certains champs.
En lisant le manuel des deux commandes et en utilisant un pipe, donnez une commande permettant d'afficher la liste des notes, uniquement, dans l'ordre croissant.
cut
permet de découper les lignes selon les virgules à l'aide de l'option -d","
cut
permet de restituer uniquement les notes, c'est à dire la deuxième colonne, avec l'option -f2
On utilise la commande suivante.
$ cut -d"," -f2 notes.csv | sort -n
5
8
8
10
12
15
18
19
cut -d","
permet de découper notre fichier CSV en colonnes en utilisant la virgule comme séparateur. L'option -f2
permet de récupérer la seconde colonne, c'est à dire la liste des notes.
À l'aide d'un pipe on redirige cette sortie sur la commande sort
qui permet de trier par ordre croissant avec l'option -n
.
Astuces en ligne de commande
Objectifs
Savoir utiliser l'autocompletion
Savoir naviguer dans le terminal
Méthode : L'autocomplétion
L'autocomplétion est un mécanisme qui permet de compléter automatiquement une commande. Après avoir tapé le début de la commande, on appuie sur la touche TAB pour que la console complète, si possible la commande en entier. Par exemple si l'on écrit :
$ sor
L'appui sur la touche TAB va compléter la commande pour écrire :
$ sort
Si il existe plusieurs commandes possibles commençant par ce qui a été écrit, alors en appuyant 2 fois sur la touche TAB la liste des commandes possibles va s'afficher. Par exemple :
$ gre
gregorio grep gresource
Conseil :
L'autocomplétion fonctionne pour les commandes, mais aussi pour les arguments, les chemins de fichiers, etc. Elle est très pratique au quotidien pour aller plus vite dans l'utilisation de la ligne de commande.
Méthode : Naviguer dans une ligne
Dans la console, il est possible de se déplacer à l'aide des touches directionnelles du clavier. Mais il est aussi possible de se déplacer au tout début de la ligne en faisant CTRL+a
ou tout à la fin avec CTRL+e.
Méthode : Historique de commandes
Le terminal maintient un historique des commandes et permet de les rappeler pour ne pas avoir à les retaper. Les touches haut et bas permettant de naviguer dans cet historique de commandes. Il est aussi possible de l'afficher à l'aide de la commande history
. Enfin, en appuyant sur CTRL+r
il est possible de faire une recherche dans l'historique.
$ grep "w" /usr/share/dict/french > mots_w.txt
bck-i-search: grep
Ici la recherche du mot grep
dans l'historique retourne la dernière commande qui correspond à ce terme. En appuyant sur Entrée, il est possible de la relancer.
À retenir
Au quotidien différents outils permettent d'aller plus vite dans une console : l'autocomplétion, les raccourcis et l'historique.
Appliquer la notion
À l'aide de l'autocomplétion, comment obtenir toutes les commandes qui commencent par lo
?
On commence à écrire lo
dans le terminal et on appuie ensuite sur la touche TAB.
$ lo
loadkeys local localectl lodraw logger logname logsave lomath loweb
loadunimap localc localedef loffice login logout loimpress look lowntfs-3g
lobase locale locale-gen lofromtemplate loginctl logrotate lollipop losetup lowriter
Quiz
Quiz - Culture
La sortie standard est :
Le programme qui permet de gérer l'extinction de la machine
Le statut de succès ou non d'une commande à la fin de son exécution
Le flux sur lequel un programme va pouvoir écrire des informations en sortie
Sous Linux, un pipe est :
un outil pour transférer le contenu d'un fichier vers un autre
un outil pour diriger la sortie standard d'une commande vers l'entrée standard d'une autre commande
une instruction permettant d'exécuter une instruction de manière conditionnelle
le logo officiel de Linux, symbole de la célèbre pipe utilisée par Linus Torvalds
À quoi sert la commande grep
?
À rechercher un fichier sur le disque
À rechercher dans un fichier
À trier un fichier
À compter les mots d'un fichier
Quiz - Méthode
Pour rediriger le résultat d'une commande dans un fichier, je peux utiliser.
macommande > monfichier
macommande | monfichier
macommande &> monfichier
macommande >> monfichier
Pour autocompléter un commande on utilise
CTRL+a
dans le terminal
La touche TAB
La flèche directionnelle vers la droite
La touche INSER
Pour retourner au début d'une ligne dans la console on utilise
CTRL+a
La touche TAB
La flèche directionnelle vers la gauche
La touche INSER
Comment retrouver une commande dans l'historique des commandes ?
Utiliser la flèche du haut du clavier
Utiliser le raccourci CTRL+r
et recherche la commande
Cherche dans le retour de la commande history
Quiz - Code
De quelle(s) manière(s) est-il possible de récupérer le résultat d'une commande pour l'utiliser dans une autre commande ?
commande1 | commande2
commande1 >> commande2
res=$(commande1)
commande2 $res
commande1 < commande2
Que fait la commande suivante cat monfichier | wc -m
Elle retourne le nombre de lignes, de mots et la taille du fichier monfichier
Elle affiche le contenu du fichier monfichier
Elle retourne le nombre de lettre dans le fichier monfichier
Quiz - Culture
La sortie standard est :
Le programme qui permet de gérer l'extinction de la machine
Le statut de succès ou non d'une commande à la fin de son exécution
Le flux sur lequel un programme va pouvoir écrire des informations en sortie
Sous Linux, un pipe est :
un outil pour transférer le contenu d'un fichier vers un autre
un outil pour diriger la sortie standard d'une commande vers l'entrée standard d'une autre commande
une instruction permettant d'exécuter une instruction de manière conditionnelle
le logo officiel de Linux, symbole de la célèbre pipe utilisée par Linus Torvalds
À quoi sert la commande grep
?
À rechercher un fichier sur le disque
À rechercher dans un fichier
À trier un fichier
À compter les mots d'un fichier
Quiz - Méthode
Pour rediriger le résultat d'une commande dans un fichier, je peux utiliser.
macommande > monfichier
macommande | monfichier
macommande &> monfichier
macommande >> monfichier
Pour autocompléter un commande on utilise
CTRL+a
dans le terminal
La touche TAB
La flèche directionnelle vers la droite
La touche INSER
Pour retourner au début d'une ligne dans la console on utilise
CTRL+a
La touche TAB
La flèche directionnelle vers la gauche
La touche INSER
Comment retrouver une commande dans l'historique des commandes ?
Utiliser la flèche du haut du clavier
Utiliser le raccourci CTRL+r
et recherche la commande
Cherche dans le retour de la commande history
Techniquement les 3 méthodes sont valables, mais la 3ème est assez inefficace, tandis que la second est très rapide.
Quiz - Code
De quelle(s) manière(s) est-il possible de récupérer le résultat d'une commande pour l'utiliser dans une autre commande ?
commande1 | commande2
commande1 >> commande2
res=$(commande1)
commande2 $res
commande1 < commande2
Que fait la commande suivante cat monfichier | wc -m
Elle retourne le nombre de lignes, de mots et la taille du fichier monfichier
Elle affiche le contenu du fichier monfichier
Elle retourne le nombre de lettre dans le fichier monfichier