Les systèmes « UNIX » 1 sont caractérisés par leurs aspects :
On n’abordera, dans le cadre de ce document, que les commandes de base du système, et leurs options les plus utilisées. Certaines options (p.ex., l’option « z » de la commande tar) ou même certains programmes (p.ex., locate) peuvent ne pas exister sous les systèmes autres que GNU/LINUX, à propos duquel ce document a été élaboré. On ne cherche en aucun cas l’exhaustivité, ni au niveau de la somme des commandes abordées, ni au niveau de chacune de leurs options
Conformément au caractère multi-utilisateur du système UNIX, chaque utilisateur possède un compte strictement personnel. Pour accéder au système (to log in), il doit donc s’identifier par son « login » (nom unique sous lequel le système le connaît, p.ex., ycopin) et son mot de passe secret (un mélange de lettres majuscules/minuscules, de chiffres et de symboles sans signification évidente). Une fois connecté au système, l’utilisateur a accès aux fonctionnalités et fichiers qui lui ont été explicitement autorisés2 .
À la fin de l’utilisation du système, il est nécessaire de se déconnecter (to log out) non seulement afin de libérer les ressources, mais également pour des raisons de sécurité – en l’occurrence ne pas permettre l’accès au système à d’autres utilisateurs sous son propre compte. La déconnexion d’un environnement graphique (p.ex., KDE) se fait à l’aide de l’icône approprié, et l’interruption d’une connexion à distance (cf. § 6.1, p.12 pour les commandes permettant les connexions à distance) se fait généralement à l’aide de la commande exit ou logout.
Les commandes sont des instructions que l’utilisateur fait exécuter au système via un interpréteur de commandes (le « shell », cf. § 7, p.13 pour un exemple particulier), généralement depuis une fenêtre de type xterm, ou éventuellement dans un fichier exécutable regroupant plusieurs commandes appelé « script » (cf. § 8, p.18).
La syntaxe standard d’une ligne de commande est la suivante, en prenant pour convention d’écrire entre crochets les parties optionnelles :
programme [-options [arguments]] [arguments]
programme est le nom du programme exécuté par la ligne de commande. Pour l’ensemble des programmes de base du système, il n’est pas nécessaire de spécifier l’adresse du répertoire où les exécutables sont stockés, et le simple nom de la commande suffit (p.ex., ls, équivalent à /bin/ls).
En revanche, les programmes non standards qui ne se trouvent pas dans les chemins décrits par la variable PATH (cf. § 7.4.2, p.17) doivent être adressés explicitement pour exécution (p.ex.,
~/projet/bin/programme ou ./programme).
Les options permettent de modifier, si besoin, le rôle du programme. Ainsi, si sort permet de trier les lignes d’un fichier dans l’ordre alphabétique, sort -r permet de les trier dans le sens inverse (Reverse). Les options courtes sont généralement constituées d’une seule lettre précédée d’un « - », et les options dites longues d’un -- (p.ex., --help ou --version). Plusieurs options courtes peuvent éventuellement être concaténées (p.ex., ls -al est équivalent à ls -a -l).
Les arguments sont les objets qui seront affectés par le programme (p.ex., less toto.txt va afficher le fichier toto.txt). Ils peuvent être optionnels s’il existe un argument par défaut.
Attention
Les systèmes UNIX font la différence entre les majuscules et les minuscules : toto.txt 6=ToTo.TxT.
La plupart des commandes (p.ex., grep) disposent d’une aide en ligne décrivant en détail le rôle du programme, l’ensemble des options disponibles, des exemples d’utilisation, etc. Cette aide, qui constitue la documentation de référence des commandes, est accessible par la commande man (p.ex., man grep), ou de plus en plus par la commande info (p.ex., info grep).
Conseil
Ne pas hésiter à utiliser l’aide en ligne pour connaître tous les détails d’une commande.
Pour les commandes les plus complexes, il est également intéressant de consulter les manuels et « tutorials » du WEB.
L’argument d’une commande est le plus souvent un nom de fichier, de répertoire, etc., c-à-d une chaîne de caractères. Cette chaîne de caractères peut être explicite (p.ex., la chaîne de caractères /etc/ passwd désigne de manière univoque le fichier /etc/passwd) ou générique (p.ex., la chaîne « *.c » désigne l’ensemble des fichiers dont le nom finit par « .c », voir ci-dessous).
Certains caractères – appelés méta-caractères – ont ainsi une signification particulière dans les commandes et permettent de construire des chaînes de caractères génériques complexes3.
Concernant les méta-caractères du shell (cf. § 7.2.1, p.14 pour plus de détails, et § 4.1, p.7 pour une description des méta-charactères des expressions régulières), les plus courants sont les suivants :
* désigne une chaîne de caractères quelconque ;
? désigne un caractère quelconque ;
[...] désigne un caractère parmi ceux entre crochets, définis par énumération ou par intervalle ;
[!...] désigne un caractère autres que ceux entre crochets, définis par énumération ou par intervalle.
Par exemple :
[aeiouy] désigne une voyelle quelconque,
[!aeiouy] désigne un caractère autre qu’une voyelle,
[0-9a-zA-Z] désigne un caractère alphanumérique quelconque,
[!A-Z] désigne tous les caractères autres que les majuscules,
Que désigne la chaîne générique « ?[aeiuoy]*[!0-9].pas » ?
Pour l’utilisateur λ, il existe sous UNIX trois grands types de fichiers : le fichier « normal », le répertoire et le fichier « spécial » (que nous ne considérerons pas ici, p.ex., /dev/cdrom). La gestion de ces différents fichiers est assurée par le système de fichiers.
Le fichier normal contient des données, parfois éditables avec un éditeur de texte, parfois binaires et uniquement lisibles par un programme approprié. Un répertoire est une sorte de classeur, dans lequel sont stockés des fichiers normaux afin de mieux organiser l’espace de stockage. Un répertoire peut également contenir d’autres répertoires (sous-répertoires), contenant eux-mêmes des fichiers et/ou des répertoires (sous-sous-répertoires), et ainsi de suite. Ce système hiérarchique prend le nom d’arborescence (cf. Fig. 1).
Tous les fichiers sont contenus dans un répertoire père, à l’exception du répertoire « / », dit répertoire racine, qui constitue le « père des pères » des répertoires. À la création d’un répertoire dans l’arborescence, deux sous-répertoires particuliers sont automatiquement créés, le répertoire « . », désignant le répertoire lui-même, et le répertoire « .. », désignant le répertoire père. Cependant, ces répertoires, s’i existent, ne sont pas répertoriés par défaut, de même que tous les fichiers dont le nom commence par « . » (fichiers ou répertoires cachés).
Pour accéder à un fichier particulier dans l’arborescence, il faut pouvoir l’identifier de façon univoque parmi tous les autres fichiers. Le nom qu’on lui affecte a au maximum 255 caractères, et peut contenir a priori n’importe quel caractère (y compris les espaces, mais avec toutefois des réserves quant à l’utilisation des caractères accentués, pas toujours supportés par les systèmes non-francisés). Cependant, pour une utilisation pratique de la ligne de commande, il est préférable que ces noms de fichier ne contiennent pas de caractères spéciaux – p.ex., les méta-caractères du shell – pour ne pas poser d’incessants problèmes d’interprétation abusive. En général, on se restreint donc à l’utilisation des majuscules, des minuscules, des chiffres et du symbole « _ ».
Connaissant le nom du fichier (p.ex., le fichier unix.tex) et sa position dans l’arborescence, c-à-d l’adresse de son répertoire père (p.ex., le répertoire /home/ycopin/tex/), on peut accéder au fichier de deux façon : le chemin absolu désigne l’adresse du fichier à partir de la racine, et commence donc nécessairement par le caractère « / » ; pour le fichier exemple, on a donc /home/ycopin/tex/unix.tex, le chemin relatif désigne l’adresse du fichier relativement au répertoire dans lequel on se trouve au moment de taper la commande (le répertoire courant, c-à-d le répertoire « . »). Ainsi, si le répertoire courant est le répertoire /home/ycopin, le ficher précédent peut être accédé par l’adresse relative. /tex/unix.tex ou plus généralement, puisque le « ./ » est optionnel, par tex/unix.tex4
.
En revanche, si le répertoire courant est le répertoire prog de /home/ycopin, le même fichier pourra être adressé par l’adresse relative ../tex/unix.tex. Comme on le voit – et comme son nom le laisse supposer... –, l’adresse relative dépend du répertoire courant dans lequel on émet la commande.
Les deux type d’adressage, absolu et relatif, sont tous les deux parfaitement valides et strictement équivalents : les deux adresses peuvent toujours être utilisées indifféremment dans une commande.
Une adresse absolue commence toujours par « / », et une adresse relative par « ./ » (optionnel) ou « ../ ».
Dans l’intégralité de l’arborescence, deux fichiers ne peuvent par définition avoir la même adresse absolue. Ainsi, les fichiers d’un même répertoire ne peuvent évidemment pas avoir le même nom ; en revanche, deux fichiers dans des répertoires différents peuvent être homonymes, puisqu’il n’y a alors pas risque de confusion.
Savoir repérer l’ensemble des fichiers et répertoires de la Fig. 1 de façons absolue et relative. En particulier, comment repérer explicitement un fichier dans le répertoire courant ?
Les commandes directement liées au système de fichiers sont :
pwd affiche le nom absolu du répertoire courant (Print Working Directory), cd [répertoire] change de répertoire (Change Directory), de manière relative ou absolue. Sans argument, la commande renvoie au répertoire principal de l’utilisateur (« home directory »), tandis que l’argument « - » renvoie au répertoire courant précédent, c-à-d le dernier répertoire courant avant le répertoire actuel.
Dans la plupart des shells, le caractère « ~ » désigne le répertoire principal de l’utilisateur (Home directory), tandis que la chaîne « ~user » désigne le répertoire principal de l’utilisateur user. Ainsi, étant l’utilisateur ycopin, la commande cd ~ est équivalente aux commandes cd et cd ~ycopin.
Me trouvant initialement dans mon répertoire principal, où suis-je après la série de commandes suivante : « cd .. ; cd ; cd - ; cd ~ ; cd . » ? (les « ; » ne servent qu’à séparer les commandes, cf. § 7.2.3, p.15)
Comme on l’a vu, un répertoire n’est qu’un fichier un peu particulier. La plupart des commandes de gestion des fichiers peuvent donc également s’appliquer aux répertoires, au prix éventuel d’une option supplémentaire. La récursivité est la propriété d’étendre la commande à l’ensemble de l’arborescence d’un répertoire (c-à-d à tous ses sous-répertoires, sous-sous-répertoires, etc., et l’ensemble des fichiers de ces répertoires).