Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (21778B)
1 #! page 2 title: Archélogie des commandes POSIX \(rédaction en cours\) 3 author: Arthur Pons 4 description: Explorons la raison d\'être des commandes les plus obscures des commandes POSIX 5 publication: 2024-11-05 6 7 sectionmd: main 8 9 ***CET ARTICLE EST EN COURS DE REDACTION, IL EST PUBLIÉ EN AVANCE POUR 10 FACILITER L'ÉCHANGE AVEC DES PERSONNES SUSCEPTIBLES DE POUVOIR L'AMÉLIORER***. 11 12 En 2024 est sorti une nouvelle version de 13 [POSIX](https://fr.wikipedia.org/wiki/POSIX) nommée [POSIX 14 2024](https://pubs.opengroup.org/onlinepubs/9799919799/). C'est l'occasion 15 parfaite de (re)découvrir la liste des commandes spécifiées dans son volume 16 [XCU](https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap01.html), 17 décrivant le shell et les commandes associées. Pour les nouveautés de cette 18 version 2024 je vous renvoie vers [ce super article]() malheureusement tout en 19 anglais. 20 21 Dans [la traduction française des principes du 22 perma-computing](https://timothee.goguely.com/blog/pppermapublishing/) trouvable 23 sur le site de Timothée Goguely on peut lire : 24 25 > Il est bon d’expérimenter de nouvelles idées, de nouveaux concepts et de 26 > nouveaux langages, mais en dépendre est généralement une mauvaise idée. 27 > Appréciez les technologies matures, les idées claires et les théories bien 28 > comprises lorsque vous construisez quelque chose qui est destiné à durer. 29 > 30 > * Vous pouvez aussi lire cela comme « faites pousser vos racines sur un sol 31 > solide ». Apprenez des choses qui durent, enrichissez votre tradition locale, 32 > connaissez l’histoire de chaque chose. 33 34 Pour chaque commande je vais donc tenter, dans la limite de ce que je trouve 35 publiquement sur internet et dans les cerveaux autour de moi, de comprendre 36 son utilité, son histoire et les raisons de son éventuelle désuétude. Je 37 remercie les contributeurices à wikipedia que je vais évidemment largement 38 plagier. 39 40 Évidemment ce que constitue une commande "obscure" ne sera pas identique pour 41 moi ou pour vous. Les critères que j'ai utilisé pour intégrer une commande à cet 42 article ou pas sont strictement personnels. Par exemple, j'y ajoute 43 volontairement des commandes en réalité assez connues simplement parce que je les 44 aime bien et je pense qu'elles gagneraient à l'être encore plus ! 45 46 La liste, surtout dans sa première version, ne sera pas complète. Si vous avez 47 des informations supplémentaires ou des corrections à y apporter n'hésitez pas à 48 me contacter. Je n'étais pas vivant ou ne pratiquait pas l'informatique durant 49 la création et/ou l'usage de ces commandes donc il y en aura forcément. 50 51 L'immense majorité des sources que je vais citer son anglais et je ne vais pas 52 systématiquement les traduire. 53 54 ## Les commandes 55 56 [La liste 57 complète](https://pubs.opengroup.org/onlinepubs/9799919799/idx/utilities.html) 58 59 Je les prends par ordre alphabétique. 60 61 ### admin, delta, get, prs, rmdel, sact, sccs, unget, val, what 62 63 Fin 1972 le "Source Code Control System" (SCCS) est développé pour versionner le 64 code d'un IBM System/370. Il est ensuite réécrit en C pour être utilisé sous 65 Unix.[^1] Avec l'avènement de nouveaux logiciels de versionnages SCCS semble être 66 tombé en désuétude[^2]. Son histoire commune avec Unix offre une place de choix à 67 ses commandes. 68 69 L'usage était d'utiliser la commande `sccs` comme "frontend" pour les autres. 70 Par exemple 71 72 sccs -d /x -p y get a/b 73 74 devient 75 76 get /x/a/y/s.b 77 78 En plus des commandes implémentées indépendamment de `sccs`, il en existe tout 79 un tas implémenté en tant que "built-in" de `sccs`[^3]. 80 81 ### ar 82 83 `ar` est utilisé pour créer des archives. Aujourd'hui on utiliserait plutôt 84 `tar`.`ar` précède `tar` de 8 ans. `ar` reste utilisé pour créer des 85 bibliothèques statiques au format `.a`, l'idée étant de combiner tout ses 86 fichiers objets `.o` en une seule archive plus facile à invoquer à la 87 compilation. Il est également utilisé pour créer les paquets debian `.deb` dans 88 lesquels on retrouve tout de même deux archives `.tar`[^5]. 89 90 Pourquoi `ar` n'est plus utilisé pour faire des archives en dehors de ces deux 91 cas ? J'ai trouvé quatre raisons : 92 93 1. Possiblement du fait d'un manque de standardisation du format, comme écrit 94 dans la norme POSIX[^4] : 95 96 > The archive format is not described. It is recognized that there are several 97 > known ar formats, which are not compatible. The ar utility is included, 98 > however, to allow creation of archives that are intended for use only on one 99 > machine. 100 101 A l'inverse `tar` venait avec un format spécifié et ouvert, permettant à 102 l'outil d'être implémenté plus facilement et à différentes implémentations 103 d'être compatibles. 104 105 2. `ar` ne conserve pas l'arborescence de fichiers, les droits d'exécutions etc 106 107 Si l'on a 108 109 /tmp/test 110 ├── A 111 │ └── bidule 112 └── truc 113 114 que l'on ajoute ces fichiers à une archive en faisant 115 116 $ ar rcs test.ar /tmp/test/A/bidule /tmp/test/truc 117 118 puis que l'on extrait les fichiers de l'archive ailleurs : 119 120 $ ar x test.ar 121 $ tree 122 /tmp/test2 123 ├── bidule 124 ├── test.ar 125 └── truc 126 127 On ne retrouve pas notre dossier `A`. Si `truc` avait été un exécutable, il ne 128 le serait plus une fois décompressé non plus. 129 130 3. `tar`, c'est à dire "**T**ape archive" gère mieux l'écriture sur bande 131 132 Je ne suis pas certain de bien comprendre les détails mais il semblerait que 133 `tar` permet de faciliter l'écriture sur bande[^7]. 134 135 4. La structure des archives `ar` permet aux routines contenues dans des 136 fichiers objets de s'appeller rapidement entre elles 137 138 D'après le manuel : 139 140 > ar creates an index to the symbols defined in relocatable object 141 > modules in the archive when you specify the modifier s. Once created, 142 > this index is updated in the archive whenever ar makes a change to its 143 > contents (save for the q update operation). An archive with such an 144 > index speeds up linking to the library, and allows routines in the 145 > library to call each other without regard to their placement in the 146 > archive. 147 148 Comme pour l'histoire des bandes je ne comprends pas les détails mais il 149 semblerait que `tar` fonctionne suffisament différement pour que les tarballs 150 ne puissent pas être utilisés de cette façon. 151 152 Après ces recherches je réalise que l'association immédiate que je fais entre 153 le concept d'archive numérique et les outils tels que `tar`, `zip`, `7zip` m'a 154 rendu plus confus que je n'aurais du l'être. Le type d'archive créé par `ar` a 155 été pensé pour faire des bibliothèques et, même si il peut dans une certaine 156 mesure être utilisé comme celui de `tar`, ils ne devraient pas être considérés 157 comme concurrents. 158 159 [Cette réponse de "Clifford" sur Stack 160 Overflow](https://stackoverflow.com/a/1551672) indique que sur d'autres 161 systèmes l'utilitaire permettant de créer ce type d'archive est nommé 162 "librarian"[^8], faisant donc spécfiquement référence à son usage principal. 163 Je n'ai pas vérifié cette affirmation. 164 165 [Cette réponse de Steve Kirkendall sur le newsgroup 166 comp.os.linux.misc](https://narkive.com/5pVR8Y6S.12) résume bien tout ce que 167 j'ai dit et termine sur : 168 169 > So that's basically it. Tar archives are more portable, more 170 > resiliant when damage occurs, and can handle odd block sizes. 171 > Ar archives are easier to access and more compact. 172 173 En français : 174 175 > Les archives tar sont plus portables, plus résilientes aux erreurs et peuvent 176 > gérer des tailles de blocs différents. Les archives Ar sont plus faciles 177 > d'accès et plus compactes. 178 179 ### asa 180 181 Avant l'avènement des terminaux avec écran, l'interaction avec les ordinateurs 182 se faisait via des téléscripteurs[^10]. 183 184 ![Un téléscripteur Teletype Model 33 ASR](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/ASR-33_at_CHM.agr.jpg/220px-ASR-33_at_CHM.agr.jpg) 185 186 Ces téléscripteurs étaient munis (ou couplés avec ?) d'imprimantes permettant 187 d'inscrire sur papier la sortie d'une commande. Afin de contrôler le comportement 188 du chariot de l'imprimante et le mouvement du papier des caractères spéciaux 189 sont nécessaires.Par exemple, début 1960 des caractères sont spécifiés pour 190 le langage FORTAN[^11]. Par exemple un `-` en début de ligne indiquera que le 191 papier doit être déroulé de 3 lignes avant de commencer l'impression[^12]. 192 193 Ces charactères seront ensuite standardisé par l'ASA (*A*merican *S*tandards 194 *A*ssociation)[^13] dans un document nommé "ANSI X3.78-1981"[^9]. Ils seront donc 195 connus sous le nom de "ASA carriage control characters". 196 197 Sous Unix une commande nommé `asa` fera son introduction 198 199 (quand ?) 200 201 pour convertir les fameux charactère trouvés au début de chaque ligne en quoi 202 que ce soit de nécessaire pour que l'imprimante utilisée derrière fasse ce 203 qu'elle doit faire. `asa` est donc généralement utilisé en amont d'une 204 commande lançant l'impression, typiquement `lp`. La spécification POSIX 205 mentionne par exemple que certaines implémentations remplacent le `+` par le 206 caractère ASCII de retour chariot 207 208 (pourquoi ne pas insérer directement le caractère, qu'est-ce 209 qui vient avant l'autre ?) 210 211 . 212 213 Je me suis demandé pourquoi est-ce que les caractères ASCII n'étaient pas 214 directement utilisés (`CR LF LF LF` plutôt que `-`). Je pense que l'explication 215 vient du fait que l'ASCII a été publié en 1963[^14] et que le premier téléscripteur 216 le supportant, le Teletype Model 33, a été commercialisé la même année. Les 217 codes ASA et leurs usages pour FORTRAN prédateraient donc de quelques années 218 l'ASCII. 219 220 ### at 221 222 Permet de programmer des commandes dans le futur un peu comme un crontab 223 interactif non régulier. N'est pas vraiment obscure mais je ne la connaissais 224 pas. 225 226 $ echo "seq 10" | at now +2 minutes 227 228 lancera `seq 10` dans deux minutes. Permet de créer des queues de commandes qui 229 s'exécuteront les une derrière les autres. Pour une personne comme moi qui se 230 retrouve rarement dans d'autres situations que : 231 232 * lancer des commandes en direct hop hop hop 233 * programmer des commandes à intervalles réguliers dans un crontab. 234 235 l'utilité de `at` n'est pas évidente. On verra ça [dans la commande 236 batch](/posix-archeo/#batch). En arrière plan `at` utilise `cron`[^15]. 237 238 ### batch 239 240 Fortement corrélée à `at`, `batch` permet de lancer une suite de programmes les 241 un derrière les autres dans une queue. C'est un alias pour la commande `at` avec 242 les options de queues. 243 244 Avant les systèmes d'exploitation tel qu'on les connaît aujourd'hui il existait 245 des programmes ayant pour objectif de lancer des commandes les une derrière les 246 autres. Les commandes étaient regroupées dans des lots (ou batch en anglais 247 roll credits). A l'époque ces lots étaient physiques, un tas cohérent de carte 248 perforées. Les ordinateurs de l'époque étant généralement monotâche, lents et 249 toujours multi-utilisateurs[^20], la concurrence pour les ressources était 250 rude. Les systèmes de traitement par lots on gagné en intelligence pour 251 prioriser le lancement des commandes et des lots en fonction de la charge de 252 l'ordinateur et des périodes d'activité[^15]. Au delà du simple fait de 253 programmer le lancement d'un autre programme, c'est cette logique qu'assurent 254 les commandes `batch`, `at` et [`nice`](). Cette idée de lancer, dans un 255 certain ordre, plusieurs tâches à l'avenir sans qu'une personne ne l'ait 256 demandé sur le moment, était novatrice à l'époque. Dans le bouquin "Unix Power 257 Tools" il est rapporté que Jeff Summler appelait ça des "software robots"[^29]. 258 259 Aujourd'hui si l'usage littéral de `batch` n'est plus très fréquent le concept 260 perdure : 261 262 * dans les scripts des langages haut niveau. Un script shell est une suite 263 d'instruction et de programmes à lancer les un derrière les autres. 264 * dans les environnements multi-utilisateurs[^21] contraints en ressource, 265 typiquement les centres de calcul où l'on retrouve des systèmes de batch 266 très sophistiqués tels que [`slurm`](https://github.com/SchedMD/slurm) 267 * dans le langage courant où un `batch` est entendu comme toute opération 268 programmatique répétée sur ensemble de donnée. Par exemple générer toutes 269 les pages HTML d'un site catium 270 271 ### cflow 272 273 Fait parti des nombreuses commandes que je ne connaissais pas parce que lié 274 au développement. `cflow` parcours un fichier source et affiche dans la sortie 275 standard un graph sous la forme d'un arbre. Par exemple : 276 277 $ cflow src/fzy.c src/options.c 278 main() <int main (int argc, char *argv[]) at src/fzy.c:17>: 279 options_parse() <void options_parse (options_t *options, int argc, char *argv[]) at src/options.c:96>: 280 options_init() <void options_init (options_t *options) at src/options.c:69>: 281 [...] 282 sscanf() 283 usage() <void usage (const char *argv0) at src/options.c:37>: 284 fprintf() 285 atoi() 286 strcmp() 287 fprintf() 288 choices_init() 289 fprintf() 290 [...] 291 tty_interface_run() 292 choices_destroy() 293 294 L'outil permet donc d'étudier et d'analyser le flot d'exécution d'un programme 295 en parcourant l'arbre sans avoir à le compiler et l'exécuter. Il ne me semble 296 pas (plus) beaucoup utilisé à en croire le peu de résultats d'une recherche sur 297 le web. 298 299 La seule implémentation facilement accessible est celle de GNU[^16], débutée en 300 2005[^17] depuis une version datant au plus tard de 1997[^18]. Sur wikipedia 301 il est inscrit que `cflow` apparaît pour la première fois dans System V[^19] 302 sans aucune référence pour le prouver. Cela placerait sa publication au plus 303 tôt en 1983[^22] soit trois ans avant 304 [GDB](https://en.wikipedia.org/wiki/GNU_Debugger). 305 306 (Peut-être que ça l'a rendu obsolète ?) 307 308 ### cksum 309 310 `cksum` calcul et vérifie la somme de contrôle d'un fichier donnée. 311 Pour calculer le hach `cksum` utilise un algorithme de contrôle de redondance 312 cyclique utilisé par Ethernet et donc extrêmement répandu[^23]. Cette fonction 313 de hachage n'est pas considérée comme cryptographiquement sécurisée[^24]. Elle 314 est maintenue pour des raisons de portabilité mais n'est réservée que pour les 315 cas où l'on veut, au mieux, vérifier si le transfert d'un fichier s'est passé 316 sans erreur accidentelle[^25]. Tout modèle de menace plus sérieux requiert 317 l'utilisation de [fonction de hachage cryptographique]( 318 https://fr.wikipedia.org/wiki/Fonction_de_hachage_cryptographique) telle que 319 [SHA-2](https://en.wikipedia.org/wiki/SHA-2). 320 321 La version GNU de `cksum` inclue la possibilité d'utiliser d'autres algorithmes 322 qui sont par ailleurs accessibles autrement. Les deux commandes suivantes calculent 323 le même hash : 324 325 cksum -a sha256 fichier 326 sha256sum fichier 327 328 ### comm 329 330 Une commande sur laquelle il n'y a pas grand chose à dire en terme d'historique 331 mais que j'ai trouvé particulièrement utile une fois pour ma [gestion de 332 playlist](/musique/#synchronisation). Je ne l'avais jamais envisagé comme cela 333 mais l'article wikipedia [le compare à 334 `diff`](https://en.wikipedia.org/wiki/Comm#Comparison_to_diff). Il est vrai que 335 pour les usages courants de `diff` `comm` peut paraître obsolète. Pour un usage 336 plus programmatique, dans des scripts et lorsque la sortie en TSV convient, 337 `comm` peut être l'outil qu'il vous faut. 338 339 ### ed 340 341 `ed` est un éditeur de texte, le seul spécifié dans POSIX. De nombreux articles 342 expliquent déjà l'histoire d'`ed` et ses liens avec des outils que nous 343 connaissont aujourd'hui tels que `vi` et `vim`. Je recommande fortement [cet 344 article de Gustavo Pezzi](https://pikuma.com/blog/origins-of-vim-text-editor). 345 En plus du plaisir d'en apprendre plus sur des outils que l'on utilise, l'article 346 rappelle habilement que, comme tout objet technique, la forme et les 347 fonctionnalités des éditeurs de textes ont autant été informés par les 348 conditions matérielles de leurs créations que par les idées des personnes les 349 codant. Ainsi dans `vi` on se déplace avec `hjkl` entre autre parce que le 350 clavier du développeur n'avait pas de flèches sur son clavier et `vi` est, 351 encore jusqu'à aujourd'hui, plus "sobre" qu'Emacs parce que son développeur 352 avait un modem extrêment lent. 353 354 Je ne résiste pas à l'idée à vous partager cette fameuse blague de Patrick J. 355 LoPresti, écrite à une époque où l'usage d'`ed` se faisait déjà rare en 356 comparaison avec `vi` et `emacs` : https://www.gnu.org/fun/jokes/ed-msg.txt 357 358 La blague du premier paragraphe, c'est à dire le fait de justifier l'usage 359 d'`ed` par son adéquation avec un téléscripteurs déjà considéré obsolète pour 360 l'époque, résonne en moi. Avec les copaines de Katzele nous utilisons parfois 361 cet argument au premier degré pour justifier certains de nos usages ou suggérer 362 des modifications : "Le site est cool mais je ne peux pas le consulter dans 363 lynx sur mon raspberry 1 !". 364 365 Cette blague a été postée sur le newsgroup `alt.religion.emacs` (ce qui est 366 déjà drôle en soit) et on peut y trouver des réponses dans [cette archive tenue 367 par Google](https://groups.google.com/g/alt.religion.emacs/c/nNdf_DRqKIU) 368 (désolé). On y voit en particulier que la blague éternelle de ne pas savoir 369 quitter `vim` était, en 1991, faite à propos d'`ed` : 370 371 > James D. Oliver III : 372 > So how *do* you get out of ed? The only thing I could manage was to 373 > Ctrl-Z and then kill the job. 374 375 On peut voir dans [cette vidéo de la 376 BBC](https://www.youtube.com/watch?v=b6URa-PTqfA&t=100s) un présentateur 377 utiliser un programme du style d'`ed` pour faire une modification à l'aide 378 d'une commande qui ressemblerait beaucoup à `s/Fred/Mary/g` dans `ed`[^28]. 379 380 Bien que, au delà de la blague, `ed` soit réellement l'éditeur de texte le 381 *plus* standard dans le monde d'Unix, il n'est pas disponible par défaut sur 382 de nombreuses distributions Linux y compris Debian[^26]. Il y a eu une tentative 383 de l'ajouter à nouveau mais sans succès[^27], je vous laisse lire les arguments 384 pour et contre. Cette absence ne concerne pas que `ed`. Beaucoup de commandes 385 dans POSIX ne sont plus essentielles pour le bon fonctionnement des Unix modernes 386 et puisque presque aucun ne cherche activement à obtenir la certification mais 387 seulement en être proche[^30], ces commandes passent à la trappe. L'un des 388 arguments en faveur du l'absence du paquet `ed` dans l'installation par défaut 389 est la faible utilisation du paquet. A ce sujet un utilisateur pointe vers [les 390 statisques maintenues par debian](https://qa.debian.org/popcon.php?package=ed). 391 Ooooooh le beau graph généré avec gnuplot ! On reconnait là le style `w lp` et 392 la belle couleur violette par défaut. Les tics de l'axe des abscisses pourrait 393 être amélioré avec un petit `set xtics rotate by -45 offset 5,0`. 394 395 ### ctags 396 397 `ctags` parcourt du code C et créer un fichier indexant les fonctions, les 398 structures etc. 399 400 [^1]: citation needed 401 [^2]: pourquoi ? trouver de vieilles discussions dessus 402 [^3]: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sccs.html#tag_20_108_13 403 [^4]: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/ar.html#tag_20_03_18 404 [^5]: https://en.wikipedia.org/wiki/Deb_(file_format)#Implementation 405 [^6]: http://ftp.gnu.org/old-gnu/Manuals/tar/html_node/tar_130.html 406 [^7]: https://en.wikipedia.org/wiki/Tar_(computing)#Rationale, la source provient de John Gilmore, connu entre pour avoir créé l'EFF et être un libertarien comme le monde du logiciel libre sait en créer. Souvent [pour le pire](https://en.wikipedia.org/wiki/Eric_S._Raymond#Political_beliefs_and_activism) 407 [^8]: bibilothécaire 408 [^9]: que je n'ai trouvé nul part 409 [^10]: en anglais teleprinters ou teletyperiter ou teletype du nom d'une entreprise en fabriquant, simplifié en tty 410 [^11]: https://bitsavers.trailing-edge.com/pdf/ibm/1401/C24-1455-2_Fortran_Specifications_and_Operating_Procedures_Apr65.pdf 411 [^12]: un résumé sur la page wikipedia : https://en.wikipedia.org/wiki/ASA_carriage_control_characters#Operation 412 [^13]: l'ancien nom de l'ANSI (*A*merican *N*ational *S*tandards *I*nstitute) 413 [^14]: https://www.sensitiveresearch.com/Archive/CharCodeHist/X3.4-1963/page1.JPG 414 [^15]: https://ibg.colorado.edu/~lessem/psyc5112/usail/automation/at.html 415 [^16]: https://gnu.org/software/cflow/ 416 [^17]: https://git.savannah.gnu.org/cgit/cflow.git/commit/?h=initial_1997&id=e6b82b1e33b2a61353cd87b1a99b46ff05b93f5c 417 [^18]: https://git.savannah.gnu.org/cgit/cflow.git/tree/src/main.c?h=initial_1997&id=e6b82b1e33b2a61353cd87b1a99b46ff05b93f5c#n3 418 [^19]: https://en.wikipedia.org/wiki/List_of_POSIX_commands#List 419 [^20]: dans le sens "utilisé par plusieurs personnes" et non pas "tournant sur un système d'exploitation pouvant avoir plusieurs comptes". 420 [^21]: cette fois-ci au sens "utilisé par plusieurs personnes via plusieurs comptes". 421 [^22]: https://unix.org/Posters/download/unix_posterA3_Screen.pdf 422 [^23]: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/cksum.html#tag_20_19_03 423 [^24]: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/cksum.html#:~:text=However,%20this%20comparison%20cannot%20be%20considered%20cryptographically%20secure 424 [^25]: ce qui est le cas d'usage d'Ethernet qui veut vérifier qu'aucun bruit n'a corrompu les paquets 425 [^26]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=416585 426 [^27]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776413, l'argument initial semble raisonnable mais mieux vaut éviter de trainer sur le site de son auteur au risque d'être confronté à certaines opinions tranchantes... 427 [^28]: ou vim ce qui n'est pas surprenant si vous avez lu l'article sur son histoire 428 [^29]: https://docstore.mik.ua/orelly/unix3/upt/ch25_01.htm, inclue d'autres éléments expliquant la nécessité d'utiliser `at` pour l'époque. 429 [^30]: https://en.wikipedia.org/wiki/POSIX#POSIX-certified