Ligne de commande

Arthur Perret (Université Jean Moulin Lyon 3)

🚧 Page en construction — Dernière mise à jour : 21/03/2024

Cette page propose une introduction à la ligne de commande, un mode d’interaction avec les ordinateurs qui repose sur des instructions textuelles. Je donne ici quelques repères terminologiques et des indications pratiques pour aborder cet outil extrêmement utile mais mal connu.

1 Notions

1.1 Ligne de commande

La ligne de commande est une interface conversationnelle entre humain et ordinateur : l’humain saisit des instructions et l’ordinateur affiche des informations en retour. Ce dialogue passe essentiellement par du texte : les instructions humaines sont écrites, de même que les messages renvoyés par l’ordinateur.

La ligne de commande est apparue dans les années 1960 et 1970 avec l’invention des télétypes puis des consoles. Ces périphériques, constitués au minimum d’un écran et d’un clavier, permettaient pour la première fois un dialogue entre humain et ordinateur.

Un exemple d’équipement informatique des années 1970. À l’arrière-plan, des unités centrales (mainframe). À l’avant-plan, des consoles.

1.2 Terminal

On désigne couramment comme « terminal » un programme qui émule le fonctionnement d’un terminal informatique (comme une console). Il s’agit d’une application qui affiche des fenêtres, dans lesquelles on peut interagir en ligne de commande avec le système d’exploitation, par l’intermédiaire d’un shell (voir section suivante pour la définition de ce dernier terme).

Un exemple de terminal, sur macOS. La barre au sommet de la fenêtre (fond clair) affiche le nom du dossier courant et du shell (ici, Zsh). L’intérieur de la fenêtre (fond noir) affiche les interactions successives entre humain et machine.

Un terminal inclut généralement des fonctionnalités qui facilitent le travail en ligne de commande. Ceci inclut par exemple l’usage de couleurs pour distinguer différents types d’informations, et l’autocomplétion des noms de répertoires et de fichiers pour accélérer la saisie.

1.3 Shell

Un shell est un programme qui permet d’interagir avec le système d’exploitation. Le nom est dérivé du fait qu’il s’agit de la couche la plus extérieure du système d’exploitation, sa « coque » (en anglais shell) par opposition à son « noyau » (kernel).

Un shell donne accès à des fonctionnalités du système d’exploitation, comme gérer des fichiers et exécuter des applications. Un shell est toujours associé à un langage de script, dans lequel on rédige les instructions données au shell.

J’y reviens plus en détail dans la section Utiliser un shell.

1.4 Invite de commande

L’invite de commande (en anglais prompt) est un indicateur destiné à l’utilisateur, qui lui montre que le shell est prêt à recevoir des instructions. Concrètement, il s’agit d’une succession de caractères textuels, dont la forme dépend du système d’exploitation et du shell.

L’invite inclut généralement des informations comme le chemin du répertoire courant (le répertoire dans lequel se situe l’utilisateur à un instant t). Elle se termine par un caractère tel que $, %, #, :, > ou -, qui dans certains cas indique le statut de l’utilisateur (administrateur ou nom). L’invite peut occuper une ou plusieurs lignes.

Reprenons l’exemple de terminal montré plus haut. Ici l’invite comporte deux lignes. La première ligne indique le répertoire courant ~/Documents (où le tilde ~ symbolise le répertoire utilisateur /Users/arthurperret). La seconde ligne affiche le signe pour cent % qui indique que l’utilisateur a le statut d’administrateur, et un curseur qui marque l’emplacement où se fera l’insertion des caractères lorsque l’utilisateur écrira une commande.

2 Utiliser un terminal

2.1 Ouvrir un terminal

Sur macOS, ouvrir l’application « Terminal » située dans « Applications/Utilitaires ».

Sur Windows, ouvrir soit « Invite de commande » soit « Powershell ». Ce dernier est un terminal plus moderne, qui requiert moins de paramétrage manuel. (Par exemple, si vous utilisez « Invite de commande », il peut être utile de saisir la commande chcp 65001 avant toute chose pour régler l’encodage sur UTF-8. Pas besoin de faire cela dans PowerShell.)

Sur Linux, chercher une application nommée « Terminal » (ou qui inclut ce mot dans son nom) parmi les applications installées.

Vous devriez maintenant voir une fenêtre avec une invite de commande :

user@computer:~$  

L’exemple ci-dessus correspond au shell Bash sur Linux.

Pour le reste de ce guide, nous utiliserons un exemple de terminal simplifié basé sur le terminal de macOS, avec juste cette invite :

% 

2.2 Commandes

Une commande est une instruction qu’on saisit dans le terminal et qu’on exécute en appuyant sur la touche Entrée. Une commande commence généralement par le nom d’un programme. L’exécution du programme peut s’accompagner d’un message dans le terminal mais pas nécessairement : beaucoup de programmes s’exécutent silencieusement.

Voici un exemple de commande dont le résultat s’affiche directement dans le terminal.

% date
Jeu 21 mar 2024 10:04:36 CET

Dans l’exemple ci-dessus, on demande au shell d’exécuter le programme date, dont la fonction par défaut est d’afficher la date et l’heure.

Pour les lignes correspondant aux commandes, on parle d’entrée (en anglais standard input, STDIN). Pour les « réponses » de la machine (lorsqu’il y en a), on parle de sortie (en anglais standard output, STDOUT).

Notez l’emploi de lettres minuscules pour invoquer le programme date : la ligne de commande est sensible à la casse, et les programmes ont généralement des noms en minuscules.

date fait partie des programmes fournis avec le système d’exploitation sur macOS et dans la plupart des distributions Linux. Un équivalent dans Powershell sur Windows : Get-Date.

2.2.1 Options

On peut ajouter des instructions supplémentaires à la suite du nom du programme, pour modifier son comportement. Reprenons l’exemple ci-dessus et ajoutons une option (en anglais flag) :

% date -u
Jeu 21 mar 2024 09:04:38 UTC

L’option -u demande à date d’afficher l’heure au temps universel coordonné (UTC), au lieu du fuseau horaire dans lequel se trouve la machine (ici : l’heure d’Europe centrale, CET).

Dans un terminal, les espaces sont importants, autant que la différence entre minuscules et majuscules. Les noms de programmes et les options doivent être séparés par au moins un espace. Si vous omettez l’espace entre date et -u, le terminal essaiera de lancer un programme nommé date-u, qui n’existe probablement pas, ce qui affichera un message d’erreur.

Dans la plupart des programmes, les options commencent généralement par un ou deux tirets. Chaque programme dispose de ses propres options. Pour connaître la liste des options disponibles pour un programme, il faut se référer à son manuel d’utilisation ; plus d’information sur ce point juste en dessous.

2.2.2 Arguments

Parfois, une commande ou une option a besoin qu’on lui donne des informations qui ne sont pas déterminées à l’avance mais spécifiées par l’utilisateur. C’est ce qu’on appelle un argument.

% man date

Dans l’exemple ci-dessus, on exécute le programme man, dont la fonction est d’afficher des manuels d’utilisation. Si on se contente d’utiliser man, le système nous renvoie une ligne de texte : What manual page do you want?. Il faut préciser pour quel programme on souhaite consulter un manuel, ce qui se fait en indiquant le nom du programme en argument de la commande man.

Pour fermer une page man, appuyez sur la touche q (pour quitter).

La plupart des programmes fournis avec le système d’exploitation incluent un manuel qu’on peut visualiser avec man. Pour les autres, on peut faire une petite recherche sur le Web pour trouver de la documentation.

2.2.3 Historique des commandes exécutées

Écrire des commandes peut vite devenir répétitif, voire carrément fastidieux. Heureusement, il est possible de gagner du temps : utilisez la flèche du haut pour revenir en arrière dans l’historique des commandes que vous avez déjà envoyées ; lorsque vous avez trouvé la commande que vous souhaitez envoyer à nouveau, appuyez sur Entrée.

Vous pouvez également utiliser la commande history pour afficher la liste des commandes déjà envoyées.

2.3 Où suis-je ?

Quand on ouvre un terminal, il se passe la même chose que lorsqu’on ouvre une fenêtre dans un explorateur de fichiers : on atterrit quelque part dans l’ordinateur, plus précisément dans le système de fichiers et de dossiers (dans la suite de cette page, on utilisera plutôt « répertoire » que « dossier »).

Les sections suivantes expliquent comment savoir où on se trouve et commencer se déplacer dans le système de fichiers via un terminal. Si vous le souhaitez, vous pouvez ouvrir côte à côte un terminal et une fenêtre d’explorateur de fichiers, pour vérifier que ce que vous voyez dans le terminal correspond bien à ce que vous verriez dans l’explorateur de fichiers.

Pour savoir où vous êtes, si vous êtes sous Linux ou macOS, utilisez la commande pwd. Sous Windows, utilisez plutôt la commande echo %cd%.

% pwd
/Users/username

pwd signifie print working directory, c’est-à-dire « afficher le nom du répertoire courant ».

Le répertoire courant n’est pas un dossier particulier sur votre ordinateur mais celui dans lequel vous vous trouvez à un instant t. Généralement, le répertoire courant utilisé à l’ouverture d’un terminal est le répertoire personnel de l’utilisateur (en anglais home directory), c’est-à-dire le répertoire dont le nom est identique au login de l’utilisateur (comme dans l’exemple ci-dessus). Ensuite, à chaque fois qu’on se déplace, le répertoire dans lequel on se déplace devient le nouveau répertoire courant.

pwd affiche le répertoire courant sous forme de chemin, c’est-à-dire une représentation textuelle de l’emplacement de ce répertoire dans le système de fichiers. Certains terminaux affichent le chemin du répertoire courant dans l’invite de commande, donc pwd n’est pas toujours nécessaire pour savoir où vous êtes.

Pour lister le contenu du répertoire courant, utilisez la commande ls. Celle-ci affiche une liste de répertoires et de fichiers.


Dans le reste de cette page, les exemples utilisent des chemins à la façon de macOS. Par exemple, le répertoire personnel sera désigné comme suit :

/Users/username

username doit être remplacé par votre nom d’utilisateur réel. Sous Windows, cela ressemblerait à ceci :

C:\Users\username

3 Utiliser un shell

La section précédente expliquait les bases de l’utilisation du terminal : le principe des commandes et comment se déplacer dans le système de fichiers.

Cette section explique comment utiliser le shell, qui est la partie du système d’exploitation avec laquelle on interagit quand on utilise un terminal. Il s’agit notamment de gérer des enchaînements de commandes, ainsi que de créer des instructions plus complexes que des commandes.

3.1 Exemples de shells

Bash (Bourne-Again shell) est le shell par défaut dans de nombreuses distributions Linux, disponible aussi sous Windows sous la forme du sous-système Windows pour Linux.

Zsh (Z shell) est le shell qui a remplacé Bash comme shell par défaut sur macOS depuis 2019 (largement rétrocompatible avec Bash).

PowerShell est le shell Windows moderne, successeur de MS-DOS et du programme cmd.exe.

3.2 L’art de la tuyauterie

Dans un shell, on appelle « entrée » (input) les données qui sont transmises à un programme, et « sortie » (output) les données générées par un programme au terme de son exécution.

L’exemple le plus simple d’entrée et de sortie est le cas où un utilisateur saisit une commande et où le terminal affiche un message en retour : l’entrée, c’est la commande de l’utilisateur ; la sortie, c’est le message affiché par l’ordinateur dans le terminal. (Visuellement, on peut distinguer facilement entrée et sortie : seule l’entrée est précédée par l’invite de commande.)

Mais au-delà de cet exemple de dialogue basique, le shell inclut différents mécanismes qui permettent de manipuler entrée et sortie. Le plus emblématique est le tuyau (pipe), symbolisé par la barre droite | : il permet de transformer la sortie d’un processus en l’entrée du processus suivant. C’est un opérateur de redirection : il redirige un flux de sortie vers un flux d’entrée.

Exemple :

history | grep Documents

La commande history génère une liste des commandes exécutées jusqu’ici dans le terminal. Lorsque history est exécutée seule, cette sortie s’affiche dans le terminal. Mais ici, on redirige cette sortie vers une autre commande, grep. Cette dernière sert à chercher du texte. Ici, on lui demande de chercher le mot « Documents ». Lorsque grep est utilisée seule, elle requiert qu’on lui indique le nom d’un fichier dans lequel la recherche doit être effectuée. Mais lorsqu’on lui fournit un flux d’entrée via |, c’est dans ce dernier qu’elle effectue la recherche. Cet enchaînement revient donc à chercher le mot « Documents » dans l’historique des commandes.

Le tuyau | symbolise la philosophie Unix : chaque programme fait une seule chose mais le fait très bien, et passe le résultat au programme suivant. Cette philosophie prend tout son sens dans le contexte des systèmes dérivés d’Unix (Linux et macOS), dans lesquels sont pré-installés des programmes de ce type, mais elle est applicable aussi à Windows, moyennant quelques installations.

3.3 Scripts shell

Un shell est toujours associé à un langage de programmation (en anglais langage de script) dans lequel on peut rédiger des instructions données au shell. Ces instructions combinent des commandes avec des outils de programmation : variables, structures conditionnelles (si… alors…), etc.

Quelle est l’utilité d’écrire un programme dans un langage de script shell ? Tout simplement, cela sert à élaborer des suites d’instructions plus complexes qu’une simple commande, qu’on pourra ensuite exécuter d’un coup en exécutant le programme.

3.3.1 Rédiger un programme shell

Voici un exemple de programme simple :

#!/bin/zsh
echo "Où suis-je ?"
pwd

La première ligne indique par quel shell ce programme doit être exécuté : elle commence par le shebang #!, suivi du chemin du shell. Cette ligne est facultative ; elle est utile si on a écrit le programme en utilisant des capacités spécifiques à un shell, et qu’on veut s’assurer que ce shell soit bien utilisé lors de l’exécution du programme.

Le reste du programme est une série d’instructions. La deuxième ligne indique que le shell doit exécuter la commande echo, qui sert à afficher du texte dans la fenêtre, le texte à afficher étant indiqué entre les guillemets. La troisième ligne indique que le shell doit exécuter la commande pwd, qui sert à afficher le chemin complet du répertoire courant.

Pour vérifier qu’il n’y a pas d’erreurs dans un programme, on peut utiliser un utilitaire comme ShellCheck.

3.3.2 Exécuter un programme shell

Pour exécuter ce programme, il faut l’enregistrer sous forme de fichier. On utilise généralement l’extension .sh pour indiquer à d’autres humains qu’il s’agit d’un script shell.

Exemple : on enregistre le programme présenté plus haut sous le nom programme.sh, dans le répertoire utilisateur. Puis on ouvre un terminal, on se déplace dans le répertoire contenant le programme, et on l’exécute :

% ./programme.sh
Où suis-je ?
/Users/username

Pourquoi ./programme.sh et pas programme.sh tout court ? Parce que le shell va chercher les programmes, c’est-à-dire les fichiers exécutables, à des emplacements bien précis, comme par exemple /bin ou /local/bin. La liste de ces répertoires est stockée dans une variable appelée PATH. Si le fichier programme.sh n’est pas situé dans un de ces répertoires, exécuter programme.sh renverra une erreur.

Une variable est une abstraction utilisée par les langages de programmation. C’est un conteneur, dans lequel on stocke de l’information. PATH est l’une des variables utilisées par le système d’exploitation (on parle de variables d’environnement).

Pour visualiser le contenu de PATH sur Linux et macOS :

% echo $PATH

Sur Windows :

% echo %PATH%

Un autre exemple de variable est HOME, qui contient le chemin du répertoire personnel (home directory).

Donc quand on rédige un script pour un usage dans un répertoire précis, on peut laisser le fichier dans ce répertoire et exécuter le programme via la commande ./programme.sh. En revanche, si on veut pouvoir exécuter le programme en tapant simplement programme.sh, quel que soit le répertoire courant, alors il faut mettre le fichier dans un emplacement inclus dans PATH.

Le système de fichiers prévoit généralement un répertoire pour que les utilisateurs stockent leurs programmes personnels, par exemple /Users/username/.local/bin. S’il n’existe pas, on peut tout à fait le créer et l’ajouter à la variable PATH.

Pour modifier la variable PATH, on utilise export :

export PATH=$PATH:/opt/toto/bin

La commande ci-dessus modifie PATH en prenant le contenu existant de la variable (PATH=$PATH) et en ajoutant (par l’opérateur de concaténation :) une chaîne de caractères qui correspond au répertoire qu’on veut ajouter (ici /opt/toto/bin).

Cette modification n’est pas conservée quand on ferme le terminal. Si on veut faire une modification permanente de PATH, il faut inscrire la commande export dans un fichier de configuration. Ce fichier est généralement situé dans le répertoire personnel de l’utilisateur. Son nom dépend du shell : le fichier de configuration de Bash s’appelle .bashrc, celui de Zsh s’appelle .zshrc, etc.

Pour faire la modification présentée précédemment mais de manière permanente, si on utilise par exemple le shell Zsh sur macOS on ajoute donc la ligne suivante au fichier /Users/username/.zshrc :

export PATH=$PATH:/opt/toto/bin