URL: https://linuxfr.org/users/chat_de_sorciere/journaux/tu-souhaites-apprendre-a-programmer-en-shell Title: Tu souhaites apprendre à programmer en shell Authors: Michaël Date: 2012年08月17日T22:31:50+02:00 License: CC By-SA Tags: shell et programmation Score: 48 Cher lecteur, tu souhaites apprendre à programmer le shell. Voici quelques recommendations que tu trouveras utiles (ou non). (Ceci est une version modifiée d'un de mes commentaires planqué au fond du forum. Quand j'ai pensé au fantastique appeau à troll que j'avais écrit, j'ai décidé d'en faire un journal—c'est trolldi pour encore au moins deux longues heures!) ### Usenet ### Pour apprendre à programmer il faut lire beaucoup de programmes: abonne-toi à `comp.unix.shell` tu apprendras vite! ### Bashing ### Comme bash est un gros shell bien gras, tu peux réfléchir à apprendre sh plutôt que bash. L'avantage est que tu programmeras de façon un peu plus portable — ce qui peut toujours s'avérer utile. Pour la programmation, le gros plus de bash, c'est les tableaux... quelque part j'ai envie de dire que le shell ne sert pas à programmer, mais à décrire un workflow, et que le besoin de tableau témoigne d'un problème qui ne doit pas être résolu dans le shell. Mais je ne critique pas ceux qui veulent mettre plus loin la frontière de complexité des problèmes qui appartiennent au domaine du shell, c'est aussi une affaire de goûts. En gros l'idée est que si tu utilises beaucoup ton tableau, il vaut peut-être mieux écrire un petit outil pour résoudre ton problème. Sinon, tu peux très bien coller le cotenu du tableau dans un fichier, voire dans un dossier (chaque fichier contient la valeur d' d'une cellule). ### Littérature ### Ce livre est souvent controversé, mais je te le recommande tout de même: _Unix shell programming_ de Lowell Jay Arthur (2nd édition, c'est important car souvent dans ce genre de livre, les éditions varient substantiellement). Ce livre est très imprégné de la philosophie Unix et si tu le comprends bien, tu sais bien à quoi sert le shell. Le point clef est que le shell sert à décrire un workflow et que les programmes que tu coordonnes (avec des pipes) doivent travailler sur une représentation commune des données, la plus simple possible. (XML et JSON sont beaucoup trop complexes, par exemple!) Certains outils (rares) sont très _shell-friendly:_ — `onsgmls` (James Clark) permet de passer d'un document SGML à une version validée et facile à traiter en shell (chaque élément, attribut, etc. apparaît sur sa propre ligne). — `noweb` (Norman Ramsey) est un outil de _literate porgramming_ qui utilise un format externe trivial pour pouvoir _piper_ ses documents vers un filtre Unix donné par l'utilisateur, qui va enrichir le documents (par exemple en énumérant les variables définies dans un _code snippet_). (Ce qui au passage te fait une source d'exemples de scripts awk, car la plupart de ces filtres sont écrits avec awk) — `svndump`, représente un _repository_ subversion dans un format facile à manipuler (à ceci près que les données sont très interconnectées!) Le point clef de la programmation shell est donc la création de programmes élémentaires qui travaillent sur une représentation commune des données, si possible assez simple pour éventuellement être travaillée avec sed, awk, ... (cela évite d'avoir à coder des analogue de awk et sed pour la représentation en question). ### Quelques défauts répandus ### La sous-utilisation du système de fichiers. Par exemple, le plus simple pour implémenter une table associative dans le shell est d'utiliser le système de fichiers, Lowell Jay Arthur explique ça très bien. La sous-utilisation des pipes nommés et des IPC. L'utilisation de echo lorqu'il faut utiliser printf (echo sert à afficher un message pour l'utilisateur, tout le reste doit être géré par printf). ### Quelques conseils pour se simplifier la vie ### Pour toutes tes interpolations de type _backquote_ un tant soit peu compliquée, écris une fonction auxiliaire: tu éviteras toutes sortes de migraines liées aux échappements et aux quotes! Cale toutes tes boucles `while read` dans une fonction à part que tu inséreras dans ta séquence de pipes, cela te simplifiera aussi la vie! ### Outils pour les thématiques de base ### En gros les thématiques de bases sont: * fichiers: date (pour les noms horodatés), mv, cp, rm, tar, find, xargs, mktemp ou sa variante qui marche. * base de données: join, paste, etc. (pour préparer ton input à awk! et trop souvent méconnus) * filtres: sort, sed, awk, cut, head, tail, grep. * portabilité: command. Ensuite viennent les outils correspondant au domaine de ton problème: * unix: stat, ps, id, /etc/passwd, etc. Enfin tout le monde croit que `make` sert à compiler des programmes alors qu'en fait écrire un makefile est aussi une autre façon de programmer en shell en utilisant un point de vue très différent. Bon courage et amuse-toi bien! (PS la seconde édition du livre de Lowell Jay Arthur est complètement obsolète — je crois qu'elle parle de System V si bien qu'aucun des exemples du livre ne marche directement, cela te fera travailler!)