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
:
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.
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 *
:
res/*.jpg
par la liste de tous les fichiers de la forme QUELQUECHOSE.jpg
dans 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:
Pour exécuter un programme foo
dans un répertoire qui n'est pas dans le chemin d'accès de votre shell:
Si le programme n'est pas dans le chemin d'accès mais est dans le répertoire courant:
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 (.
):
Vous pouvez aussi modifier votre variable PATH
en ajoutant votre répertoire cible:
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
&
), tapezctrl+c
-
sinon, utilisez la commande
kill
qui prend en argument l'index de la tâche à tuer. La tâche se trouve via la commandejobs
: