datsite

Intro to command line

0. Introduction

On peut être intimidé lorsque l'on ouvre pour la première fois un terminal Linux. C'est un outil extrêmement pratique mais que l'on peut mettre du temps à maîtriser. La majorité des utilisateurs Linux s'en servent quasi quotidiennement. Nous allons voir pourquoi et comment.

Avant de commencer...

Prérequis:

  • Un minimum d'expérience avec le monde de l'informatique et de la programmation, connaissance de termes basiques (variables, conditions ...)
  • Etre un minimum familier avec le fonctionnement des fichiers Unix
Lucien Le Roux

1. Les bases

Le terminal est un TTY, c'est-à-dire un environnement capable de recevoir des instructions, et d'afficher du texte. Il existe plusieurs types de terminaux, tels que xterm, vt100, … Dans la réalité, ces terminaux sont des fichiers de type “device” stockés dans /dev/.

Le shell est l'interface entre le terminal et l'utilisateur. Un shell peut être soit en ligne de commande (CLI), soit graphique (GUI). On parlera ici du command-line shell. Son but premier est de pouvoir lancer des programmes. Il existe de nombreux shells, parmi lesquels: bash, zsh, sh, ksh, fish…

Ils permettent d'interpréter les commandes rentrées par l'utilisateur, mais rajoutent en plus des structures de contrôle permettant une syntaxe avancée (boucles, pipes, redirections, conditions, ...).

Un shell est lui-même un programme.

On peut notamment écrire des scripts, mais cela fera l'objet d'un autre tutoriel.

A chaque compte utilisateur est associé un shell (info stockée dans /etc/passwd) qui se lance automatiquement lorsque ce dernier se connecte.

Répartition des rôles terminal/shell :

  • Entrée: Le terminal convertit les touches en séquences de contrôle (flèche de gauche → '\e[D')
    Le shell récupère cette séquence et en déduit la commande associée ('\e[D' → déplacer le curseur à gauche)
  • Sortie: Le shell demande au terminal d'effectuer diverses actions, telles que 'affiche foo', 'change la couleur de fond en rouge', 'déplace le curseur à tel endroit', etc.
  • Edition de ligne, historique de commandes, auto-complétion: shell
  • Le prompt est propre au shell.
  • Le copier-coller est géré par le terminal, mais peut aussi l'être par le shell.
  • Le job control est géré par le shell, mais c'est le terminal qui intercepte les combinaisons de touches (Ctrl+C et Ctrl+Z) et opère sur le job cible.

Enfin, pour ouvrir un terminal, la macro associée est généralement Ctrl+Alt+T

Lucien Le Roux

2. Commandes

Le shell nous permet d'interagir avec notre système de fichiers. On se situe toujours quelque part lorsque l'on est dans le shell. Par exemple lorsque l'on ouvre un nouveau shell, il y a de fortes chances pour que l'on arrive dans son répertoire home (souvent /home/username, cela peut varier).

Note: le répertoire home est souvent représenté par un tilde '~'

Comme dit plus haut, le shell permet de rentrer des commandes qui peuvent lancer des programmes.

En voici quelques-uns:

  • ls: list segments, affiche une liste des fichiers d'un répertoire.
  • pwd: print working directory, affiche le répertoire courant.
  • cd: change directory, sert à se déplacer dans un répertoire.

Ainsi, on peut savoir à tout moment où l'on se situe en tapant la commande pwd. Essayez!

Alors, comment savoir quels programmes existent et lesquels peuvent vous être utiles ?

A force de les utiliser, on retient les plus utiles. Ci-dessous une liste non exhaustive qui peut vous aider à démarrer en ligne de commande.

Commande signification Description Notes Exemple d'utilisation
awk Aho, Weinberger & Kernighan Manipulation de lignes de texte cat monfichier | awk '/term/ { print $1 }'
bash GNU Bourne Again Shell Un shell peut-être l'utilisez vous actuellement! bash
cat Catenate Permet de concaténer des fichiers et d'afficher leur contenu cat -n monfichier
cd Change Directory Change le dossier courant '.' = dossier courant, '..' = dossier parent, '-' = dossier précédent cd ..
chmod Change mode Modifie les permissions d'un fichier
chown Change owner Modifie le propriétaire d'un fichier Seul le propriétaire du fichier concerné peut effectuer cette commande chown lucien:lucien mondossier/
cp Copy Copie un fichier cp fichier copie_fichier
clear Clear Efface l'écran du terminal Ctrl+L réalise la même chose clear
date Date Affiche la date date +'%H:%M:%S'
env Environment Affiche les variables d'environnemnt env -0
exit Exit Ferme la session courante Si plusieurs sessions imbriquées, la session parente prend le dessus après fermeture de la courante. exit
find Find Recherche récursivement un fichier par son nom find ~ -type d -name mondossier
grep :g/re/p Recherche une chaîne de caractères à l'aide d'expressions régulières (regexp) env | grep ^PATH
gzip GNU Zip Compresse des fichiers extension .gz gzip -f monfichiercompresse.tar.gz monarchive.tar
ifconfig Interface Configurator Permet de configurer et d'afficher les interfaces réseau IP ifconfig
jobs Jobs Affiche les jobs existants jobs
kill Kill Met fin à un processus kill -HUP 9804
ls List Segments Affiche le contenu d'un répertoire ls -ltr /home -R
man Manual Affiche la documentation d'une commande ou fonction man ls
mkdir Make directory Crée un dossier mkdir mondossier
mv Move Déplace/renomme un fichier Attention aux fausses manipulations lorsqu'on travaille avec des dossiers ayant le même nom: faites des backup! mv mondossier1 mondossier
ping Packet Internet Groper Teste l'accessiblité d'un réseau à travers un réseau IP ping -c 5 google.fr
ps processes (?) Affiche les processus en cours d'éxécution ps -a
rm Remove Supprime un fichier Attention, pas de corbeille sur Unix! rm -r mondossier/
sed Stream editor Permet d'appliquer des transformations à un flux de texte sed '/^$/d' monfichier
shutdown Shutdown Eteint la machine shutdown now
tar Tape Archiver Archive des fichiers Extension .tar tar -cvf monarchive.tar mondossier/
touch Touch Modifie le timestamp de dernière modification d'un fichier touch file va créer le fichier file s'il n'existe pas. touch monfichier
uname Unix name Affiche les informations système uname -a
vi Visual (interface) Editeur de texte vi
whoami Who am I Affiche le nom associé à l'UID courant whoami
Lucien Le Roux

3. Le Path

Vous pouvez vous demandez, mais où sont stockés tous ces programmes ? Eh bien, cela dépend.

En effet, il existe une variable définie par le shell appelée 'PATH', qui contient un ensemble de chemins vers des répertoires contenant la plupart de ces programmes. Le PATH peut ressembler à ce qui suit:

PATH=/usr/local/heroku/bin:/bin:/sbin:/usr/bin:/usr/sbin:/home/le-rou_c/bin
Note: vous pouvez voir votre propre path en tapant “env | grep ^PATH”

Ce PATH consiste en une suite de chemins séparés par deux points ':'. Lorsque l'utilisateur rentre une commande, telle que 'ls', le shell va chercher parmi tous ces répertoires si l'un d'entre eux contient le programme demandé. S'il ne le trouve pas, alors il affichera une erreur indiquant qu'il n'a pas trouvé la commande.

Un test simple pour vérifier que le shell fonctionne bien ainsi est de 'unset le PATH', c'est-à-dire de supprimer la variable de l'environnement du shell. Il n'aura alors nulle part où chercher et toutes les commandes échoueront (sauf les commandes builtins, heureusement !)

Le programme which permet de chercher l'emplacement d'un programme donné. Par exemple, pour ls :

$ which ls
bin/ls

ls est donc situé dans le dossier /bin, et si l'on regarde bien on remarque que celui-ci fait partie du PATH !

On peut également éxécuter un programme via son chemin absolu ou relatif, sans utiliser le PATH du shell. Il suffit tout simplement d'indiquer l'emplacement de l'éxécutable.

Sans préciser de chemin:

$ ls
file1 file2

En utilisant le chemin absolu:

$ /bin/ls
file1 file2

En utilisant le chemin relatif:

$ cd /
$ bin/ls
bin dev home usr .....
$ cd bin
$ ./ls
arch awk basename bash cat chgrp chmod .....
Note: faire précéder le nom du binaire de './' si ce dernier se trouve dans le dossier courant est nécessaire car le PATH ne contient généralement pas le dossier courant ('.') pour des raisons de sécurité. En revanche, si on l'ajoute au PATH, un simple 'ls' éxécutera le programme ls s'il est situé dans le même répertoire. Cela n'est pas propre à ls mais est valable pour tous les fichiers exécutables!
Lucien Le Roux

4. L'environnement

La variable PATH n'est pas la seule utilisée par le shell. En réalité, le shell dispose d'un environnement contenant plusieurs variables. On peut en voir la liste grâce à la built-in 'env'. On y trouve notamment le nom de la machine, le type de terminal, le shell courant, le nom d'utilisateur, le fameux PATH, le dossier courant, le dossier précédent, et bien d'autres.

En shell (plus particulièrement Bourne shell), on accède à la valeur d'une variable en faisant précéder son nom du signe '$'. Ainsi, si l'on veut afficher la valeur d'une variable, on peut utiliser echo vu précédemment :

echo $USER

...affichera votre nom d'utilisateur.

On peut manipuler l'environnement comme l'on souhaite, mais il ne faut pas faire n'importe quoi avec non plus (par exemple supprimer le PATH !). Ainsi on peut ajouter, supprimer, et modifier les variables présentes dans l'environnement.

Ajout/modification:

export MY_VARIABLE=truc
Note: le mot-clé 'export' permet de préciser que l'on fait référence à une variable d'environnement, et non pas une simple variable.

Suppression:

unset MY_VARIABLE
Lucien Le Roux

5. Bonus

Vous avez sûrement remarqué ce texte qui s'affiche avant chaque commande que vous rentrez : il s'agit du prompt. Son contenu est lui aussi stocké dans l'environnement du shell, sous le nom de PS1.

Pour voir à quoi il ressemble :

echo $PS1

Vous pouvez bien évidemment modifier ce prompt pour le personnaliser comme vous le souhaitez. Plus d'infos à ce propos dans le tutoriel qui lui est consacré !

Lucien Le Roux