Page suivante   Page précédente Table des matières  

1. Un bref historique des commandes `rm' et `rmdir'

Par Eric Fisher enf@pobox.com

Contrairement à la plupart des utilitaires de base d'Unix et de Linux, le nom de la commande rm n'est en fait pas plus vieux qu'Unix lui-même. Dans les prédécesseurs d'Unix, le CTSS (Compatible Time Sharing System) et Multics, la commande utilisée pour supprimer des fichiers était appelée delete, ce qui en Multics pouvait éventuellement être abrégé par dl. En Unix, le nom est devenu rm, probablement pour retracer le changement de philosophie entre le fait d'effacer des fichiers et de supprimer les entrées d'un répertoire liées à ceux-ci.

La commande rmdir servant à effacer des répertoires faisait également partie d'Unix au moment de la parution de son manuel Première Edition (le 3 Novembre 1971). Aujourd'hui, la commande rmdir fait juste un appel système à rmdir() pour chacun de ses arguments et rapporte les erreurs s'il y en a. Mais en 1971 il n'y avait pas d'appel système rmdir(), de telle manière que le programme rmdir devait faire tout le travail lui-même. Il devait s'assurer que le répertoire à effacer était bien vide, que ses permissions étaient correctes et alors seulement il supprimait les liens spéciaux ``.'' et ``..'' avant de délier le répertoire lui-même. Cette situation a perduré jusqu'en 1983, quand l'introduction du nouveau Fast File System (Système de Fichiers Rapide) par 4.2BSD a transféré vers le noyau les responsabilités de création et de suppression des répertoires.

La version de 1971 de rm n'avait aucune des options de la version actuelle. Elle était également disposée à supprimer les fichiers en lecture seule bien que dans le manuel il soit écrit qu'elle ``devrait sûrement poser la question''. Cela a été changé de telle manière qu'elle pose effectivement la question (comme le delete du CTSS le faisait en 1965) dans la nouvelle version dont le manuel était daté du 20 Janvier 1973, et qui comprenait ces options :

La façon dont l'option -r de rm était codée à cette époque faisait que quand rm rencontrait un sous-répertoire au milieu des fichiers qu'il était sensé supprimer, il faisait un cd vers ce répertoire (alors nommé chdir) et lançait une autre instance de rm -r * pour supprimer son contenu. Une version faisant la récursion dans un seul et même processus est apparue dans la Septième Edition d'Unix en 1979, qui introduisait également une nouvelle option :

Cela permettait de taper rm -i * pour supprimer de manière interactive les fichiers désirés d'un répertoire, même ceux dont le nom avait été massacré au point qu'il devienne impossible de le taper sur le clavier. Cette fonctionnalité était en fait nécessaire bien avant mais antérieurement à la Septième Edition, cela était fait par un programme séparé, à présent tombé dans l'oubli, appelé dsw.

Le nom de dsw était plus mystérieux que celui de n'importe quelle autre commande, même dans ce système d'exploitation connu pour ses noms obscurs. Le manuel de la Sixième Edition accablait de sarcasmes les curieux avec la note précisant que ``le nom dsw est une relique d'un passé lointain. Son étymologie est amusante.'' La Première Edition avait ajouté ``...mais le nom est malgré tout peu judicieux'', mais cela disparut dans les manuels suivants.

Les spéculations sur la signification réelle du nom dsw (delete s--t work ? ``effacer ce travail de m---- ?'' do svidaniya ? NdT : !?!?) a pris fin quand Dennis Ritchie révéla en 1981 dans un message Usenet que le nom signifiait à l'origine ``delete from switches'' (effacer en fonction des commutateurs). C'était une référence aux commutateurs de la façade de l'ordinateur PDP-7 sur lequel tournait les premières versions d'Unix (certaines machines plus récentes avaient également des commutateurs sur leurs consoles, et les Editions Trois à Six avaient un appel système getcsw() que les programmes pouvaient utiliser pour savoir comment ils étaient positionnés).

Pour utiliser le dsw original, vous deviez positionner les commutateurs pour qu'ils forment un nombre, puis lancer dsw qui lisait alors ce nombre d'entrées dans le répertoire courant, imprimait sur le terminal le nom de la dernière qu'il avait lue et se faisait planter lui-même, laissant derrière lui un fichier core. Vous pouviez alors, si vous le vouliez, effacer le fichier qu'il avait nommé en ré-exécutant le fichier core. Quand cette affreuse interface utilisateur a été remplacée par une plus raisonnable, le nom est resté tant que le programme complet n'a pas été remplacé par rm -i.

À ce point, l'évolution de la commande rm tira, pour la plus grande partie, à sa fin. Une version légèrement modifiée, datée du 1er avril 1981 et distribuée avec 4.2 BSD, introduisait un terminateur d'option ``-'' pour faciliter la suppression de fichiers dont le nom commençait par un tiret. Pour être homogène avec les autres commandes, le standard POSIX l'a changée en ``--'' et a permis également d'utiliser l'option majuscule ``-R'' pour effacer les répertoires récursivement.


Page suivante   Page précédente Table des matières