Utiliser la ligne de commandes
Le shell
1. Rôle
Les concepteurs d’Ubuntu ont fait de très gros efforts afin de rendre l’utilisation de Linux la plus simple possible. La complexité de l’administration sur la version Desktop est masquée par une interface agréable et vous n’avez plus qu’à utiliser vos logiciels sans avoir à effectuer des manipulations complexes.
Il n’est pourtant pas possible de se proclamer administrateur Linux (ou Ubuntu) sans savoir utiliser la ligne de commandes via le shell. Vous avez vu qu’Ubuntu Server n’a pas d’interface graphique, le passage par la console est alors obligatoire.
La console est accessible depuis n’importe quel terminal avec les touches [F3] à [F6].
Appuyez sur [Ctrl][Alt][F3], par exemple. La session graphique disparaît. Vous vous retrouvez devant une fenêtre de login en mode console.
Elle permet de se retrouver dans un environnement semblable à celui de la version Server.
Appuyez sur [Alt][F2] pour retourner sur le terminal sur lequel l’environnement graphique a été chargé, ou sur [Alt][F1] pour retourner sur le terminal de login en mode graphique.
Il est également possible d’émuler une console depuis le menu Afficher les applications, en cliquant sur Terminal. Celui-ci s’ouvre alors :
L’utilisateur a alors accès à l’interpréteur de commandes, qui permet d’exécuter des instructions saisies au clavier ou au sein d’un script, et d’en retourner les résultats. L’interpréteur est aussi appelé le shell.
Il existe plusieurs shells, chacun disposant de spécificités propres mais Ubuntu a choisi le shell le plus courant sur Linux, le bash (Bourne Again SHell).
La liste des shells actuellement présents sur votre installation Linux est présente dans le fichier...
L’éditeur vi
L’éditeur Linux/Unix par défaut se nomme vi (visual editor). Il n’est pas le plus ergonomique mais, contrairement à nano, il est disponible sur tous les Linux/Unix. Il est possible d’installer une version améliorée de vi, vim, par la commande sudo apt install vim.
vi [options] Fichier [Fichier2 ...]
vi n’a pas de menus, pas d’interface graphique et n’est pas intuitif. Il faut connaître par cœur des raccourcis-clavier. Mais une fois maîtrisé, vi se révèle rapide et pratique, au point qu’on est plus efficace qu’avec des éditeurs texte.
La suite vous présente les commandes de base de vi, qui suffisent dans 99 % des cas.
1. Fonctionnement
Il y a trois modes de fonctionnement :
-
Mode commande : les caractères saisis représentent des commandes. On y accède en appuyant sur [Echap]. Chaque touche ou combinaison de touches déclenche une action (suppression de lignes, insertions, déplacement, copier, coller, etc.).
-
Mode saisie : c’est la saisie de texte classique.
-
Mode ligne de commande : une ligne en bas d’écran permet de saisir des commandes spéciales, validée avec la touche [Entrée]. On y accède en appuyant, en mode commande, sur la touche [:].
Quand vous lancez vi, il est par défaut en mode commande. Pour commencer à taper du texte, il faut taper une commande d’ajout ([a]) ou d’insertion ([i]) : [Echap]+[i] permet de saisir du texte (passage en mode commande + insertion). Pour quitter, passez par le mode ligne de commande : [Echap]+[:], [q] + [Entrée].
Si vous êtes perdu, dans tous les cas et quoi qu’il arrive, un appui sur [Echap] revient toujours en mode commande.
2. Commandes de base
a. Saisie
Les actions suivantes sont en mode commande. Elles...
Gestion des fichiers
1. Système de fichiers FHS
Un système de fichiers, appelé communément filesystem ou FS, définit l’organisation des données sur un support de stockage, c’est-à-dire comment sont gérés et organisés les fichiers par le système d’exploitation.
Linux est un système d’exploitation entièrement orienté fichier. Tout (ou presque) est représenté par un fichier, tant les données que les périphériques ou encore les moyens de communication (sockets, tubes nommés, etc.). Le système de fichiers est le cœur de tout système Linux/Unix.
Le système de fichiers de Linux est hiérarchique. Il décrit une arborescence de répertoires et de sous-répertoires, en partant d’un élément de base appelé la racine ou root directory. La hiérarchie se nomme FHS (Filesystem Hierarchy Standard) et comprend les répertoires suivants :
Chemin |
Contenu |
/ |
Répertoire racine, base du système de fichiers. |
/bin |
Fichiers binaires exécutables. |
/boot |
Fichiers nécessaires au démarrage. |
/cdrom |
Répertoire de montage par défaut des CD et DVD. |
/dev |
Fichiers spéciaux des périphériques. |
/etc |
Fichiers de configuration du système et de diverses applications. |
/home |
Dossiers personnels des utilisateurs. |
/lib |
Bibliothèques du système. On trouve également les dossiers lib32, lib64 et libx32 pour les systèmes supportant plusieurs architectures binaires. |
/lib64 |
Idem mais en 64 bits. |
/lost+found |
Répertoire contenant les fichiers orphelins ou endommagés trouvés lors d’une vérification du système de fichiers. Sa présence indique que le répertoire courant est la racine d’un système... |
Recherche
1. Rechercher des fichiers
La commande find permet de rechercher des fichiers au sein de l’arborescence du système de fichiers à l’aide de critères et elle donne la possibilité d’agir sur les résultats retournés.
find chemin critères options
La commande find étant récursive, il suffit d’indiquer un répertoire de base pour que toute l’arborescence depuis ce répertoire soit parcourue. La syntaxe étant très complète, seules quelques notions de base vous sont expliquées ici. Reportez-vous au manuel de la commande pour plus d’informations.
a. Critères de recherche
Les paramètres permettent de définir les critères de recherche. Ces critères, s’il y en a plusieurs, sont combinés entre eux par une conjonction ET (critère1 ET critère2).
Critère |
Recherche |
-name, -iname |
Recherche les fichiers indiqués, selon le modèle. -iname ne respecte pas la casse. |
-type |
Par type de fichiers (f : ordinaire, d : répertoire, etc.). |
-user, -group |
Par utilisateur ou par groupe. |
-size |
Par taille. Le suffixe peut être b (bloc de 512 octets), c (octets) ou k (Ko). La valeur peut être préfixée : + (plus de) ou - (moins de). |
-empty |
Fichiers vides. |
-atime, -mtime, -ctime |
Par date d’accès, de modification ou de changement, exprimée en jours, éventuellement préfixée par + ou -. |
Exemple de recherche de fichiers finissant par mkv de plus de 4 Go auxquels on n’a pas accédé depuis six mois :
$ find / -iname "*.mkv" -size +4194304 -atime +180
Pensez à exécuter la commande avec sudo...
b. Options
Outre l’option -print (induite, qui affiche les résultats), on trouve d’autres options permettant d’effectuer une action sur les fichiers...
Redirections
1. Les canaux
Tout flux de données en entrée ou en sortie de commande passe par un canal. Il est possible de dévier le cours des données vers une autre destination (un fichier par exemple) ou depuis une autre source. Un système UNIX propose par défaut trois canaux, appelés canaux standards :
-
Canal 0 ou STDIN : l’entrée, par défaut le clavier.
-
Canal 1 ou STDOUT : la sortie standard, par défaut le terminal.
-
Canal 2 ou STDERR : la sortie d’erreurs, par défaut le terminal.
2. En sortie
On se sert du caractère > pour rediriger la sortie standard (celle qui va normalement vers le terminal). On indique ensuite le nom du fichier où seront placés les résultats de la commande.
$ ls -l > resultat.txt
$ cat resultat.txt
total 1
-rw-r--r-- 1 Administ ssh_user 0 Jul 4 12:04 TOTO
-rw-r--r-- 1 Administ ssh_user 0 Jul 25 15:13 resultat.txt
-rw-r--r-- 1 Administ ssh_user 171 Jul 25 15:13 test.txt
Le shell commence d’abord par créer le fichier puis exécute ensuite la commande. Si le fichier n’existe pas, il sera créé. S’il existe, son contenu sera écrasé même si la commande tapée est incorrecte.
Pour rajouter des données à la suite du fichier sans en écraser le contenu, on utilise la double redirection >>.
$ date >> resultat.txt
3. En entrée
Les commandes qui attendent des données ou des paramètres depuis le clavier peuvent aussi en recevoir depuis un fichier, à l’aide du caractère <, par exemple la commande wc (word count), qui permet de compter...
Quelques filtres et utilitaires
Une commande filtre est un programme qui lit et écrit des données par les canaux et en modifie la sortie.
1. Les tubes ou pipes
Les tubes ou pipes permettent de rediriger directement le canal de sortie d’une commande vers le canal d’entrée d’une autre. Le caractère permettant cela est | accessible depuis la combinaison de touches [Alt Gr][6] des claviers français.
$ ls -l|wc
57 519 3602
La dernière commande peut elle-même faire l’objet d’une redirection en sortie.
$ ls -l | wc > resultat.txt
2. Rechercher des lignes
Il s’agit d’extraire des lignes d’un flux selon divers critères. Vous utiliserez la commande grep.
grep [Options] modèle [Fichier1...]
Le modèle se compose de critères de recherche de type texte avec éventuellement des séquences de substitution. La commande suivante recherche les lignes contenant « root » dans le fichier des utilisateurs :
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
Voici quelques options intéressantes :
Option |
Rôle |
-v |
Effectue la recherche inverse : toutes les lignes ne correspondant pas aux critères sont affichées. |
-c |
Ne retourne que le nombre de lignes trouvées, sans les afficher. |
-i |
Ne différencie pas les majuscules et les minuscules. |
-n |
Indique le numéro de ligne pour chaque ligne trouvée. |
Si le critère commence par un ^, la commande recherche la chaîne de caractères en tout début de ligne ; la ligne doit commencer par le critère. Et réciproquement, si le critère finit par un $, la commande recherche la chaîne de caractères en fin de ligne ; la ligne doit finir par le critère.
3. Couper des champs
La commande cut permet de sélectionner...
Variables
1. Nomenclature
Un nom de variable obéit à certaines règles :
-
Il peut être composé de lettres minuscules ou majuscules, de chiffres, et de caractères de soulignement.
-
Le premier caractère ne peut pas être un chiffre.
-
La taille d’un nom est en principe illimitée (il ne faut pas abuser non plus).
2. Déclaration et affectation
Une variable est déclarée dès qu’une valeur lui est affectée. L’affectation est effectuée avec le signe =, sans espace avant ou après le signe.
var=Bonjour
3. Accès et affichage
Vous accédez au contenu d’une variable en plaçant le signe $ devant le nom de la variable.
$ chemin=/tmp/eni
$ ls $chemin
Attention car l’espace a une signification particulière. L’exemple suivant montre le problème :
$ c=Salut les copains
les: not found
$ echo $c
Salut
Pour utiliser des caractères spéciaux, il faut soit les verrouiller par un \, soit les mettre entre guillemets (") ou apostrophes (’).
c=Salut\ les\ copains (Solution lourde)
c="Salut les copains" (Solution correcte)
c='Salut les copains' (Solution correcte)
4. Accolades
Les accolades de base {} permettent d’identifier le nom d’une variable. Imaginez la variable fichier contenant le nom de fichier ’liste’. Vous voulez copier liste1 sous le nom liste2 à l’aide de la variable :
$ fichier=liste
$ cp $fichier1 $fichier2
cp: opérande fichier manquant
Pour en savoir davantage, faites: « cp --help ».
Cela ne fonctionne pas car ce n’est pas $fichier qui est interprété mais $fichier1 et $fichier2, lesquels n’existent...
Effectuer des tests
La commande test permet d’effectuer des tests de conditions. Le résultat est récupérable par la variable $? (code retour). Si ce résultat est 0, alors la condition est réalisée.
La commande test peut être remplacée par les crochets ouverts et fermés [...] ou [[...]]. Il faut respecter un espace après et avant les crochets. La différence entre les simples et doubles crochets était initialement la suivante : les crochets simples étaient un raccourci vers test, tandis que les crochets doubles étaient le test interne du shell. Utilisez les crochets doubles, en principe plus rapides.
1. Sur des chaînes
-
[[ -z "valeur" ]] : retourne 0 si la valeur est vide.
-
[[ -n "valeur" ]] : retourne 0 si la valeur n’est pas vide.
-
[[ "valeur1" = "valeur2" ]] : 0 si les deux chaînes sont identiques.
-
[[ "valeur1" != "valeur2" ]] : 0 si les deux chaînes sont différentes.
2. Sur des valeurs numériques
Les opérateurs sont les suivants :
Option |
Rôle |
-eq |
Equal : Égal |
-ne |
Not Equal : Différent |
-lt |
Less than : Inférieur |
-gt |
Greater than : Supérieur |
-le |
Less ou equal : Inférieur ou égal |
-ge |
Greater or equal : Supérieur ou égal |
Voici un exemple de test :
$ a=10
$ b=20
$ [[ "$a" -ne "$b" ]]; echo $?
0
3. Sur les fichiers
Tous les opérateurs sur les fichiers sont unaires (un seul argument possible). Voici quelques opérateurs qui retournent 0 (zéro) si le fichier est du type attendu :
Option |
Rôle |
-f |
Fichier normal. |
-d |
Un répertoire. |
-r |
Autorisation en lecture. |
-w |
Autorisation en écriture. |
-x |
Autorisation en exécution.... |
Processus
La gestion des processus sera abordée de manière plus détaillée dans le chapitre Tâches d’administration. Cependant, dès maintenant, il vous est nécessaire de comprendre leur fonctionnement : comment les lancer, les lister et les arrêter.
1. Lancer des programmes
Vous lancez un programme en tapant son nom. Vous remarquez rapidement qu’il ne « rend pas la main » (l’invite reste bloquée) tant qu’il n’a pas fini ou que vous ne l’avez pas interrompu avec [Ctrl][c].
Le système est pourtant multitâche et un certain nombre de processus tournent déjà sur la machine. Quand une commande est saisie, le shell crée un nouveau processus pour l’exécuter mais rien ne l’oblige à attendre le message du processus terminé pour rendre la main : il suffit de saisir le ET commercial « & » à la fin de la ligne. On parle alors d’un « lancement en tâche de fond ».
Par exemple, pour enregistrer dans un fichier le résultat d’un ls récursif depuis la racine, il est nécessaire de le lancer en tâche de fond étant donné la longueur du traitement (lister le contenu de tous les répertoires du système de fichiers !). Voici la commande à utiliser :
$ ls -R / > ls.txt 2/dev/null &
[1] 21976
Juste après la saisie, un chiffre apparaît, c’est le PID du nouveau processus lancé.
Quelques remarques sur l’utilisation du lancement en tâche de fond :
-
Le processus lancé ne devrait pas attendre de saisie au risque de confusion entre cette commande et l’invite du shell.
-
Le processus lancé ne devrait pas afficher de résultats sur l’écran au risque d’avoir...
Divers
1. Calculs
Le bash propose une forme simple de calculs sur les entiers, en plaçant l’opération entre $((...)) :
$ a=1
$ a=$((a+1))
$ echo $a
2
$ b=2
$ a=$((a*b))
$ echo $a
4
Vous n’avez pas besoin de spécifier les $ des noms des variables entre les doubles parenthèses.
2. Longueur d’une chaîne
Il est possible d’obtenir la longueur d’une chaîne avec le caractère # entre accolades.
$ a=Jules
$ echo "Longueur de $a : ${#a}"
Longueur de Jules : 5
3. Substitution de commande
Le mécanisme de substitution permet de placer le résultat de commandes simples ou complexes dans une variable. Vous placez les commandes à exécuter entre des accents graves ` (touches [Alt Gr][7]) :
$ mon_unix=`uname`
$ echo ${mon_unix}
Linux
$ machine=`uname -a | cut -d" " -f5`
echo $machine
SMP
Les accents graves ne sont pas toujours idéaux pour ces manipulations. En effet, si vous faites plusieurs niveaux, vous devez verrouiller ceux qui sont à l’intérieur des premiers niveaux. Aussi, le bash permet d’utiliser la syntaxe $(…) qui n’a pas ce problème.
$ mon_unix=$(uname)
$ echo ${mon_unix}
Linux
$ machine=$(uname -a | cut -d" " -f5)
echo $machine
SMP
Mise en pratique
1. Énoncé
Vérifiez dans quel répertoire vous vous situez.
Allez dans votre répertoire personnel.
Créez un dossier nommé "Exercices" et placez-vous dans ce dossier.
Créez un répertoire "cours" et des sous-répertoires "francais", "informatique", "histoire".
Dans chaque sous-répertoire, créez des fichiers vides "cours1", "cours2" et "cours3".
Renommez le répertoire "histoire" en "histoiregeo" et le répertoire "cours" en "cours2022".
Au même niveau que le répertoire "cours2022", créez un répertoire "cours2023". Copiez l’arborescence de "cours2022" dans "cours2023".
Créez un lien vers "cours2022/francais/cours1" dans le répertoire "cours2023/francais" en remplacement du fichier existant.
Modifiez le contenu du fichier "cours2022/francais/cours1" et vérifier en ouvrant le lien précédemment créé que le contenu a bien été modifié.
Supprimez le répertoire "cours2022" et son contenu en une seule commande.
Vérifiez que le fichier "cours1" existe toujours.
Créez un fichier avec le contenu de l’historique.
Éditez ce fichier avec vi.
Copiez les 10 premières lignes et collez-les en fin de fichier.
Recherchez la chaîne "cd" et parcourez toutes les occurrences. Fermez le fichier en sauvegardant les modifications.
Recherchez tous les fichiers de type "png" dont la taille est supérieure à 1 Mo et copiez-les dans votre répertoire utilisateur.
Ouvrez les terminaux...