Skip to content

Le Terminal

Principe

Le terminal, ou ligne de commande, permet d'exécuter des programmes sans avoir à utiliser un environnement graphique. Il est essentiel de se familiariser avec cet outil pour de nombreux cas d'usages:

  • administration et configuration d'un ordinateur
  • accès à distance à un autre ordinateur
  • accéder à un appareil dépourvu d'interface graphique
  • travailler plus rapidement: dans de nombreux cas, l'interface utilisateur est certes plus conviviale mais demande plus de temps pour effectuer la même tâche (ex: Git)

Un terminal vous donne une invite de saisie de mots dans laquelle vous entrez une ou plusieurs commandes. Après avoir tapé la touche 'entrée', les commandes s'exécutent et le résultat est affiché sur l’écran en dessous de la commande.

Le programme qui lit les commandes que vous tapez dans le terminal s’appelle le shell. Il y a beaucoup de variantes de shell pas toujours compatibles. Par ailleurs, selon le système d’exploitation, les commandes varient.

  • MacOS et Linux, tous les deux basés sur Unix, ont un ensemble de commandes de base très proches.
  • Windows a un terminal DOS avec des commandes très différentes, et aussi depuis Windows7 un terminal dit PowerShell inspiré de Linux.

Note

Pour cette UE, nous travaillerons sur des shell unix/linux comme bash ou zsh.

Il est recommandé de lire ce qui suit avec un terminal ouvert à côté pour pratiquer en même temps comme indiqué ici.

Lancement du Terminal

Via l'interface graphique, le terminal se trouve assez facilement en cherchant terminal ou command.

Au démarrage, le terminal va se positionner dans le répertoire de l'utilisateur:

  • C:\users\foo sous windows
  • /Users/foo sous MacOS X et BSD
  • /home/foo sous la majeure partie des autres systèmes

Vous pouvez vérifier l'emplacement du répertoire courant en tapant pwd:

pwd
/home/foo

Vous verrez le chemin complet depuis la racine du système de fichier.

Info

Vous avez en général les droits de lecture et écriture sur tous les répertoires et fichiers dans ce répertoire, mais ce n'est pas le cas:

  • pour les autres utilisateurs accédant à votre répertoire
  • pour les répertoires auxquels vous voulez accéder

Nous verrons cela au chapitre suivant.

Programme et arguments

La ligne de commande que vous tapez dans le shell est une série de mots:

  • le mot avant le premier espace est le nom du programme (ou commande) à exécuter
  • les mots suivants sont séparés en une liste à chaque espace

L'ensemble est fourni au programme par le shell, en ajoutant au nom du programme son emplacement dans le système de fichier.

ls 1.jpg 2.jpg

Le programme ls recevra au démarrage la liste ['/bin/ls', '1.jpg', '2.jpg']. Cette liste s'appelle les arguments du programme.

Chaque programme a son propre comportement et attend donc un nombre quelconque d'arguments.

Attention

Lorsque vous créez vos programmes, prenez le réflexe de vérifier que tous les arguments passés au programme sont reconnus, qu'il n'y en a pas en trop, etc. Dans le cas contraire, retournez une erreur plutôt que d'ignorer cette situation.

Changer de répertoire

Les alias suivants sont à connaître impérativement

  • ~: répertoire utilisateur
  • .: répertoire courant
  • ..: répertoire parent

Vous pouvez changer de répertoire via la commande cd:

#aller dans votre répertoire utilisateur
cd ~

#aller dans le répertoire Documents du présent dans le répertoire courant
cd Documents

#aller dans le répertoire Music contenu dans le répertoire parent
cd ../Music

#aller (depuis n'importe où) dans le répertoire Projets dans le répertoire d'utilisateur
cd ~/Projets

#aller dans le répertoire etc en racine du système
cd /etc

Chemins relatifs et absolus

Un chemin commençant par / (ou \\, C:\, D:\ ... sous windows) est qualifié d'absolu. Un chemin ne commençant pas par / (ou \\, C:\, D:\ ... sous windows) est qualifié de relatif.

Les chemins relatifs à un répertoire R sont résolus ainsi:

  • on part du chemin absolu de R
  • on remonte dans l'arborescence autant de fois que ../ est spécifié dans le chemin relatif
  • on ajoute le reste du chemin relatif

Par exemple le chemin ../../../test.jpg depuis le répertoire:

  • /home/moi/tp/ est résolu en /test.jpg
  • /home/moi/tp/proj/src/base/ est résolu en /home/moi/tp/test.jpg

Note

Cette notion se retrouve partout sur Internet dans l'organisation des adresses web ou URL, veillez à bien l'assimiler.

Danger

Ne mettez jamais de chemins absolus dans vos programmes, scripts, etc. En déplaçant vos fichiers, votre programme ne fonctionnerait plus.

Commandes de bases

Pour la plupart de ces commandes, une aide via le terminal est possible en tapant man nom_de_commande ou parfois nom_de_commande -h ou nom_de_commande --help.

Les commandes à tester au plus vite:

commande signification
cd change de répertoire
ls affiche le contenu du répertoire
pwd affiche le chemin du répertoire courant
less FOO affiche le contenu du fichier FOO page par page; espace pour avancer, et q pour sortir
mkdir FOO crée un répertoire nommé FOO
rm FOO supprime le fichier FOO (irréversible)
rm -r FOO supprime le répertoire FOO et tout son contenu (irréversible)
mv FOO BAR renomme le fichier FOO en BAR
nano FOO édite le fichier FOO avec nano, éditeur simple en ligne de commande
vi FOO édite le fichier FOO avec vi, éditeur plus complet en ligne de commande
date affiche la date
whoami affiche le nom du compte connecté
who affiche la liste des utilisateurs connectés sur la machine
hostname affiche le nom de la machine (pratique lorsque l'on fait beaucoup de connexions ssh)
history affiche l'historique des commandes shell
man FOO affiche le manuel/aide de la commande FOO
clear efface le terminal
cat FOO prend le contenu du fichier FOO et l'écrit sur la sortie standard (attention si c'est du binaire)
grep bar FOO cherche le mot bar dans le fichier FOO
exit quitte le shell, ferme la fenêtre ou la connexion ssh

Shell et Productivité

Complétion

La touche tab permet, dans les shell modernes, de compléter le mot courant : par exemple, vous voulez afficher un fichier texte du répertoire courant dont le nom commence par apr, tapez less apr puis appuyez sur tab qui complétera le nom du fichier s’il n’y a pas d’ambiguïté ou vous proposera une liste de possibilité.

Cette complétion automatique marche aussi avec les noms de programmes, donc n'hésitez plus à utiliser la touche tab frénétiquement.

Les shell peuvent aussi interpréter certains caractères comme des règles de remplacement. L'exemple le plus courant est de spécifier un motif via le caractère *:

ls res/*.jpg
res/disque.jpg      res/terminal.jpg
Dans cet exemple, le shell remplacera res/*.jpg par la liste de tous les fichiers de la forme QUELQUECHOSE.jpgdans le répertoire res/.

Attention

Ceci ne marchera pas avec tous les programmes: si un programme ne prend qu'un seul argument, le résultat ne sera pas le même que d'appeler ce programme plusieurs fois avec chaque fichier trouvé

Historique

Vous disposez d'un historique des commandes précédemment exécutées, accessible avec les touches curseur vers le haut et vers le bas. Avec les touches curseur vers la droite et vers la gauche, vous pouvez éditer une commande passée pour la modifier, puis appuyer sur retour chariot ou enter pour l’exécuter.

Pour revenir en début de ligne, tapez ctrl+a.

Pour revenir en fin de ligne, tapez ctrl+e.

Vous pouvez naviguer dans l'historique des commandes exécutées en tapant ctrl+r, qui vous demandera de saisir un nom à rechercher. Ce nom peut être n'importe quelle chaîne de texte de la commande recherchée, pas seulement le nom du programme. Utilisez à nouveau ctrl+r pour chercher plus loin dans l'historique.

Exécuter un programme

Démarrer un programme

Un programme peut être présent dans:

  • un répertoire du système, partagé par un ensemble de programmes (ex: programmes appartenant au système d’exploitation)
  • répertoire particulier juste réservé à ce programme, surtout si ce programme a des ressources dont il a besoin
  • un répertoire quelconque où vous avez téléchargé/compilé le programme

L’installation d'un programme sur votre machine revient à créer le ou les répertoires dont ce programme a besoin sur votre machine et à y mettre toutes les ressources nécessaires, ce qui peut inclure des images, des polices, de la documentation, etc.

Le shell connaît une liste de répertoires contenant des programmes. Le shell lit votre commande, isole le nom du programme (le premier nom), va voir dans tous les répertoires s’il trouve ce programme et le lance avec les arguments que vous avez donnés. Cette information de configuration de chemin est appelée PATH.

Note

On désigne par variables d'environnements certaines informations disponibles pour le système d'exploitation, le shell ou un programme, soit en lecture seule soit en lecture/écriture. Par exemple en tapant export dans votre terminal, vous verrez la liste de toutes les variables d'environnements visibles par le shell et les programmes qu'il lancera.

Dans la majeure partie des systèmes d'exploitations, la variable d'environnement PATH décrira les répertoires où se trouvent les programmes. Par exemple, si PATH contient /usr/bin:/usr/local/bin:/opt/bin, le shell ira chercher le programme dans /usr/bin puis dans /usr/local/bin et finalement dans /opt/bin et exécutera le premier programme trouvé dans ces répertoires.

Pour connaître le chemin d'accès de votre shell:

echo $PATH

Pour exécuter un programme foo dans un répertoire qui n'est pas dans le chemin d'accès de votre shell:

./chemin/vers/foo 

Si le programme n'est pas dans le chemin d'accès mais est dans le répertoire courant:

foo 
command not found

Ceci est logique, le shell cherche le programme dans tous les chemins connus et ne le trouve pas.

Savoir

Pour des raisons de sécurité, sur les systèmes UNIX, le répertoire courant n'est jamais ajouté au PATH.

Vous devez donc indiquer le chemin vers le répertoire courant (.):

./foo 
resultats de foo

Vous pouvez aussi modifier votre variable PATH en ajoutant votre répertoire cible:

export PATH=$PATH:/chemin/vers/mon/programme

Terminer un programme

Si votre programme ne répond plus et ne vous rend pas la main, il vous faudra forcer la fermeture: on parle de tuer un processus.

Pour cela, vous pouvez utiliser le gestionnaire de tâches de votre système d'exploitation, mais cela est long et n'est pas forcément disponible facilement lors d'un accès à distance (voir chapitre suivant).

Vous pouvez aussi terminer le processus depuis le terminal qui l'a démarré:

  • si le processus a été démarré en premier plan (sans &), tapez ctrl+c

  • sinon, utilisez la commande kill qui prend en argument l'index de la tâche à tuer. La tâche se trouve via la commande jobs:

jobs
[1]  + running    programme_OK
[2]  + running    programme_KO
kill %2