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.
Prérequis:
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 :
Enfin, pour ouvrir un terminal, la macro associée est généralement Ctrl+Alt+T
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).
Comme dit plus haut, le shell permet de rentrer des commandes qui peuvent lancer des programmes.
En voici quelques-uns:
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 |
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
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 .....
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!
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
Suppression:
unset MY_VARIABLE
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é !