Les plus grands programmes Shell au monde
(github.com/oils-for-unix)- Ce wiki recense non pas simplement de longs scripts, mais une liste de programmes Shell « substantiels », écrits à la main et exploitant même des structures de données et des algorithmes
- Le seuil retenu est en général de plus de 5K lignes, et les scripts générés automatiquement ou les scripts de completion répétitifs sont exclus des exemples principaux
- Parmi les cas emblématiques figurent ble.sh avec 87K lignes, kalua avec environ 56K SLoC/lignes, Relax-and-Recover avec 35K lignes, nb avec 26K lignes et winetricks avec 22K lignes, bien au-delà de l’image habituelle que l’on se fait des scripts Shell
- La liste couvre largement des outils réellement utilisés : éditeur de ligne interactif, addon OpenWRT, débogueur Bash, outil de test TLS, implémentation de Kubernetes, outils de sauvegarde et de restauration, outil d’émission de certificats, moniteur de ressources, etc.
- Les tests OSH « Wild » parsèment plus d’un million de lignes de Shell, mais il s’agit surtout de petits programmes et de définitions répétitives de paquets de distributions, à distinguer des grands programmes Shell
Qu’est-ce qu’un « grand programme Shell » ?
- Ici, « biggest » ne désigne pas simplement le nombre brut de lignes, mais plutôt quelque chose de « substantial », c’est-à-dire d’une ampleur et d’une complexité réelles
- Sont inclus en priorité des scripts Shell écrits à la main
- les gros scripts générés par autoconf sont traités comme une exception
- des artefacts générés automatiquement, comme un script coreutils de 70K lignes, ne sont pas considérés comme de grands programmes Shell au sens substantiel
- Une attention particulière est portée aux programmes Shell qui utilisent des structures de données et des algorithmes
- bash-completion est sophistiqué, mais son organisation répétitive — avec des fonctions relativement simples pour chaque commande d’une machine Unix — en fait presque un contre-exemple
- La ligne de base approximative est de plus de 5K lignes
- les plus grands programmes Shell non répétitifs se situent généralement dans la plage des 10K+ lignes
- aucun programme dépassant 100K lignes n’a encore été identifié
Exemples des plus grands programmes Shell
- akinomyoga/ble.sh : 87K lignes au total, 63K LoC hors commentaires
- il s’agit d’un éditeur de ligne interactif de type fish, écrit en bash pur
- le fichier principal
out/ble.shcompte 39K lignes, 29K LoC hors commentaires, et avec les fichiers modules l’ensemble dépasse 80K lignes - il contient beaucoup de commentaires en japonais
- il lit les octets bruts du terminal via
bind -x, les décode lui-même avec plusieurs machines à états explicites, puis maintient et met à jour un drawing buffer - il inclut aussi du timing et des « fibers »
- des détails sur le parser Shell figurent dans les commentaires de l’issue 663, et le projet est considéré comme l’un des usages les plus sophistiqués de structures de données en Shell
- des tentatives existent pour l’exécuter sur OSH, et la majeure partie est parsée
- le premier commit faisait 8K lignes / 6K LoC en 2015, même si le développement réel a commencé en 2013
- kalua : addon OpenWRT écrit en shell POSIX, avec environ 56K SLoC/lignes
- Relax-and-Recover : outil de sauvegarde et de restauration de 35K lignes, 24K LoC
- le premier commit git date de mars 2009, avec alors 4K lignes / 3K LoC
- xwmx/nb :
nblui-même représente 26K lignes, 22K LoC en bash- si l’on compte les tests bats en bash, cela ajoute 91K lignes et 61K LoC
- le premier commit date de 2014, et l’historique de commits soutenu commence au début de 2016
- vegardit/bash-funk : bibliothèque Bash de 27K lignes au total, 24K LoC
- le premier commit remonte à mai 2017, avec alors 10K lignes / 8K LoC
- winetricks : script Shell de 22K lignes qui installe divers programmes Windows sous Wine
- drwetter/testssl.sh : 21K lignes de bash dans un seul fichier
- semble avoir été écrit à la main
- a commencé en 2006 à partir de quelques commandes
openssl - le parsing bute sur l’issue #606
- rkhunter : programme Bourne shell de 21K lignes, écrit entre 2003 et 2018
- site officiel : rkhunter.sourceforge.net
- Simplenetes : présenté comme « Kubernetes in 17K lines of Shell »
- signalé comme un cas étonnant, mais semble dormant
- un fil Hacker News est lié
- inxi 2.3.56 : programme bash de 16K lignes, indiqué comme obsolete
- forké depuis
infobashen 2008 infobashfaisait alors 889 lignes et avait démarré en 2005- à partir de la v2.9,
inxia été remplacé par une implémentation en Perl
- forké depuis
- bashdb : débogueur Bash écrit en bash, d’environ 14K lignes
- contexte associé : Implementing Debuggers
- romkatv/powerlevel10k : le répertoire
internal/contient 12K lignes de scripts zsh- s’y ajoutent 8K lignes de config et de helper scripts
- le premier commit date de 2014
- dylanaraps/neofetch : programme de 10K lignes écrit pour Bash 3.2, affichant des informations système
- il propose aussi des fonctionnalités intéressantes liées aux images
- le premier commit date de 2015
- distrobox : script bash de plus de 7K lignes permettant d’utiliser n’importe quelle distribution Linux dans le terminal
- acme.sh : script Shell de 8K lignes pour émettre et renouveler des certificats
Implémentations remarquables malgré une taille plus modeste
- bashforth : environ 3 800 lignes ; ce n’est pas énorme, mais il implémente un véritable langage de programmation
- il contient beaucoup d’espaces et de commentaires
- yoda : environ deux fois plus petit que bashforth, mais implémente à la fois un interpréteur et un compilateur complets
- c’est une implémentation du même auteur, vingt ans plus récente, avec davantage de fonctionnalités
- elle porte le commentaire « What learned you have, unlearn you must! »
Autres programmes Shell notables
- abcde / A Better CD Encoder : utilisé pour le ripping de CD, avec environ 5.5K LoC
- thc-segfault : 3.3K LoC, serveur pubnix construit majoritairement en Bash
- ffmpeg/configure : script
configurede FFmpeg, écrit à la main, avec 8.4K LoC - ffhevc : wrapper Bash entièrement écrit à la main pour encoder de la vidéo HEVC avec FFmpeg et libx265, avec 4K LoC
- ffx264 : wrapper Bash entièrement écrit à la main pour encoder de la vidéo H.264/AVC avec FFmpeg et libx264, avec 3.9K LoC
- h264enc : wrapper Bash entièrement écrit à la main pour encoder de la vidéo H.264/AVC avec MEncoder, avec 9.2K LoC
- bashtop : moniteur de ressources de 5.3K LoC
- halcyon : système d’installation d’applications Haskell, avec 6.6K LoC
- code écrit à la main, attentif à la sémantique de bash et à la vérification d’erreurs, dans un style singulier inspiré de la programmation fonctionnelle
- wordshell : environ 7K lignes de code pour gérer plusieurs sites WordPress en ligne de commande
- BaCon : environ 10K lignes, convertissant en C des programmes écrits en BASIC
- il existe une implémentation en BASIC et une autre en script Shell
- FireHOL : script principal de 9K lignes, avec l’outil FireQOS ajoutant 3K lignes supplémentaires
- c’est à la fois un langage et un programme d’exécution permettant de créer un pare-feu sécurisé et stateful à partir d’une configuration lisible par un humain
- gxadmin : 11K LoC, ensemble de requêtes SQL templated et d’utilitaires de traitement de données pour administrer le moteur de workflows scientifiques Galaxy
- mulle-bashfunctions : bibliothèque de fonctions bash/zsh d’environ 6K lignes
- utilisée par
mulle-sde, lui-même un autre script Shell de 100K lignes
- utilisée par
- x11docker : 11.6K lignes pour exécuter des applications GUI dans des conteneurs docker ou podman
Langages apparentés au Shell et DSL
- modernish : dialecte shell portable écrit en Shell
- bats : DSL pour écrire des tests, qui génère du code bash
- bashible : DSL de type Ansible écrit en bash
- des commentaires associés sont liés
- clash : framework orienté objet compatible avec tous les shells POSIX modernes
- bash Infinity : bibliothèque standard et framework boilerplate pour bash
Programmes plus petits et écosystème associé
- Les scripts Alpine, Aboriginal et Debian sont reliés dans un article de blog séparé
- Les scripts de completion sont volumineux, mais souvent répétitifs
- la completion Zsh _git représente 8.3K lignes de code
git-completion.bashet la completion Docker sont aussi cités en exemple
- dyne/Tomb : script zsh d’environ 3 500 lignes
- Basalt : package manager full-featured écrit en Bash pur
- il ne compte que quelques milliers de lignes, mais s’accompagne d’un riche écosystème comprenant plus de 15 applications et bibliothèques
- bash-core : bibliothèque qui étend les builtins
trapetshopt, et ajoute des stacktraces ainsi que des fonctions de confort essentielles - bash-object : bibliothèque en Bash pur pour construire des structures de données arbitrairement imbriquées, avec près de 200 tests
- bash-json : bibliothèque en Bash pur pour parser et produire du JSON
- tablespoon/fun/cli-clock : horloge textuelle multiligne écrite en bash
- json.bash / jb : outil en ligne de commande et bibliothèque bash pour créer du JSON
- environ 1 700 lignes, avec près de 3 000 lignes de tests
Tests OSH et points d’attention sur l’usage du Shell
- Les tests OSH « Wild » parsèment plus d’un million de lignes de Shell
- il s’agit majoritairement de petits programmes et de définitions répétitives de paquets de distribution comme Alpine
PKGBUILDou Gentooebuild
- il s’agit majoritairement de petits programmes et de définitions répétitives de paquets de distribution comme Alpine
- Shell Programs That Run Under OSH renvoie vers une liste de programmes Shell exécutables sous OSH
- shell script are dangerous avertit que le Shell est un programme destiné à manipuler les entrailles du système, en console interactive ou non interactive, qu’il est très riche en fonctionnalités, très dangereux, et qu’il n’a pas été conçu pour fabriquer des applications
1 commentaires
Commentaires sur Hacker News
En creusant, j’ai découvert que l’OMS était un énorme ensemble de scripts shell tournant sur des serveurs AIX, qui avait évolué pendant plus de 10 ans avant d’être laissé à l’abandon. Le code faisait plus de 50 000 lignes, les commandes, paiements et autres informations étaient déplacés entre serveurs via FTP puis analysés avec des combinaisons complexes de
sed/awk, et même l’inventaire était suivi dans des fichiers texte puis transféré en FTPÀ l’époque, Perl semblait être le choix le plus pratique pour migrer ce chaos, et j’ai commencé par remplacer les parties les plus simples par de petits modules Perl, avant de refactoriser progressivement l’ensemble dans une application Perl plus grande. En trois mois, j’ai réduit le tout à environ 5 000 lignes de Perl, avec des pannes quasiment disparues et des performances multipliées par 10 à 100. C’était horrible, mais cela reste l’un des travaux les plus satisfaisants que j’aie jamais faits
Je me demande si tu as tout lu et compris en profondeur pour reproduire exactement le comportement, ou si tu as jeté de gros blocs pour réécrire selon ce que tu pensais être le bon fonctionnement. Je me demande aussi s’il y avait beaucoup de code standard facile à remplacer rapidement
Le premier très gros script que j’ai écrit était un programme d’installation d’environ 7 000 lignes pour Enrust CA et l’annuaire, et il devait fonctionner sur presque tous les Unix de l’époque. Ce n’était pas le cas au départ, mais il a grossi au fil des demandes clients
L’installation elle-même n’était pas très complexe, mais les mises à niveau l’étaient un peu plus, et à l’époque chaque Unix avait des utilitaires légèrement différents. Une bonne partie du script servait à détecter et gérer ces différences, avec en plus de la détection/récupération d’erreurs, des retours en arrière, et une gestion très primitive des paquets et dépendances
Le Unix de DEC, hors Ultrix, était le plus déroutant. Il m’a fallu plusieurs jours pour comprendre que tous les utilitaires en ligne de commande tronquaient leur sortie à la largeur du terminal, et 30 ans plus tard je m’en souviens encore
HP-UX introduisait des changements cassants à chaque version, et si je me souviens bien on prenait en charge de 6.5 à 11. Je me rappelle à peine d’Ultrix, de la branche Novell, de NeXT et de Sequent. Je me souviens qu’AIX était bizarre, mais j’ai oublié pourquoi. Les trois ou quatre OS de Sun avaient aussi des différences, mais la documentation était excellente, c’était le top
wcsur le binaire principal et les bibliothèques auxiliaires d’un projet, et j’en suis à 6 224 lignes à ce jourC’était un script qui gérait des pipelines à garantie linéaire sous forme d’un ensemble de conteneurs composés d’adaptateurs de protocole d’entrée, d’un ou plusieurs filtres, et d’adaptateurs de protocole de sortie. L’objectif était que des gens qui ne sont ni experts des conteneurs ni des protocoles puissent l’utiliser, tant qu’ils savent comment ils veulent que les fichiers soient filtrés et transformés au fil du pipeline
Le binaire de plus haut niveau est structuré avec des sous-fonctions, comme
git [ git options ] < git action> [action options]ousystemctl. Il existe même une sous-commande pour ajouter de nouvelles sous-commandes, qui crée les bibliothèques nécessaires et préremplit les définitions de fonctions à partir de modèles. Les modèles contiennent des fonctions d’aide courte et longue, de sorte quecbap -houcbap pipeline -hdonnent des indications utilesIl y a des sous-commandes pour manipuler les images de base, les composants et les pipelines. Une bonne partie du code sert à tester si les définitions de composants et de pipelines sont correctement écrites. Les pipelines utilisent un format presque équivalent à TOML, donc il y a du code pour parser du TOML et convertir des sections en tableaux, tandis que les composants sont de simples fichiers
key=value, avec du code pour extraire les parties gauche et droite et valider le schémaComme les composants de pipeline peuvent partager des propriétés, il y a aussi du code pour chercher des propriétés communes dans les fichiers
varetetcet pour attribuer des propriétés aux composants. Il y a également beaucoup de fonctions pour manipuler utilisateurs, groupes, répertoires et FIFO conformément aux exigences de sécurité. Quand on configure un pipeline, on crée et applique des utilisateurs, groupes, types SELinux et catégories MCS, puis on les mappe aux fichiers de service qui démarrent les composants, donc il y a aussi beaucoup de manipulation de systemdLe plus gros ensemble d’appels concerne sans doute les fonctions qui récupèrent et définissent les propriétés des composants, en pratique les propriétés des conteneurs. Pour chaque propriété, il y a une fonction de lecture, une fonction de validation, et une version inline dans le pipeline, afin de rendre les définitions de conteneurs pilotées par les données aussi flexibles que possible
Il y a aussi pas mal de code qui s’appuie sur les références Bash pour définir des variables depuis des fichiers, des variables d’environnement et la ligne de commande, afin de permettre des tests rapides. Quatre niveaux d’utilisateurs sont pris en charge, depuis les mainteneurs qui manipulent directement le code lui-même jusqu’aux développeurs qui créent des définitions de composants, aux intégrateurs qui construisent des pipelines à partir de composants, puis aux opérateurs qui installent les pipelines, et le système peut se copier et se packager lui-même pour être livré à chacun de ces niveaux
Comme le système cible peut être n’importe quel Linux, l’empaquetage et l’extraction se font avec
makeself. Par exemple, quand un intégrateur crée une définition de pipeline, cela génère un fichiermakeselfqui, une fois exécuté sur le système cible, crée tous les utilisateurs, groupes, répertoires et FIFO — c’est-à-dire l’IPC entre composants — applique DAC/MAC, crée les fichiers systemd, copie les images à chaque utilisateur, puis lance le pipeline. Une option de suppression permet aussi d’annuler tout celaIl y a aussi un peu de seccomp, mais c’est en pause pour le moment, le temps de trouver le bon équilibre entre liste blanche et liste noire. J’utilise ShellCheck de manière vraiment intensive
On ne peut pas supposer que
bc/dcsoient présents partout, et sur certaines des machines que j’avais, la version de Bash était si ancienne que la prise en charge des tableaux associatifs était très limitée. Comme compromis, j’ai choisi AWK comme cible, et AWK est un langage généraliste bien plus agréable que la plupart des shells, tout en étant présent partout dans un environnement POSIX : https://beyondloom.com/blog/lila.htmlbc/dcdans tous les environnementsJ’ai été assez surpris de constater qu’il n’y avait apparemment pas
bc/dcdans l’installation Ubuntu de WSL2. Pour les calculs en virgule flottante, j’utilise AWK, mais simplement en l’appelant comme processus externe.Pour avoir écrit et maintenu plusieurs gros programmes Perl au cours de ma carrière, il y a une raison pour laquelle les gens font ça
Des langages comme Java ou Python conviennent bien quand les interfaces et les formats sont définis et qu’il y a peu d’interactions avec l’OS. Si on utilise JSON/XML/YAML ou qu’on communique avec une base de données, d’autres programmes ou via HTTP(S), on se retrouve dans la situation idéale où ces langages excellent
Mais dès qu’il faut gérer de gros volumes de texte et des interactions avec l’OS, Java et Python deviennent très pénibles. À l’inverse, Shell/Perl donnent l’impression d’être bien plus simples pour ce type de travail
Cela couvre presque tous les travaux d’automatisation, les interfaces confuses et non standardisées, les fichiers texte/logs, ainsi que les formats de données non structurés ou insuffisamment structurés. Si on ajoute à cela la rétrocompatibilité de Perl, son large parc installé et ses performances, il n’existe pratiquement pas d’alternative réelle à Perl pour ce genre de tâches
Cela fait longtemps que je pense que l’une des grandes raisons pour lesquelles les grandes entreprises emploient aujourd’hui des milliers de personnes pour faire manuellement des tâches pourtant facilement automatisables, c’est le recul de l’usage de Perl. Elles essaient de faire de grosses automatisations en Python ou en Java, puis abandonnent vite, rebutées par la verbosité du code à écrire et à maintenir ainsi que par l’ampleur de l’ensemble
Donc maintenant, il faut probablement en plus du personnel permanent coûteux. Si les utilisateurs finaux sont sur Windows, il existe déjà sur le desktop une option comparable à Perl. C’est PowerShell, qui joue un rôle similaire à Perl
Bash+grep a tendance à partir dans une logique où l’on lance un nouveau processus pour chaque ligne de texte. Pour être efficace, il faut minimiser le travail, ce qui implique du traitement par lots et de la déduplication. Cela signifie qu’il faut manipuler les données avec état, en suivant le contexte de déduplication, ce qui est plus simple dans un vrai langage de programmation
Bash+grep est avantageux pour le traitement de texte sans état, ce qui fait facilement exploser le travail redondant. Une autre manière de réduire le travail consiste à filtrer précisément, et cela s’exprime bien plus proprement de façon impérative dans un vrai langage. grep et les expressions régulières ne conviennent pas du tout à cet usage
Avec les formats ligne par ligne, git ajoute des échappements pour essayer d’accepter n’importe quoi, mais le support n’est pas cohérent, et on peut désactiver cela en demandant un format de chaîne terminée par un caractère nul avec l’option
-z. Bash ne semble pas avoir de moyen de traiter cela, alors que c’est naturel dans un langage suffisamment bas niveau. On peut aussi faire du streaming incrémental sans devoir lancer un nouveau processus pour chaque ligne de texteEn prime, on peut utiliser une base de code unique pour tout le travail, qu’il y ait du HTTP au milieu ou autre chose
Voici quelques liens pour donner du contexte. « Êtes-vous en train de réinventer Perl ? » : https://www.oilshell.org/blog/2021/01/why-a-new-shell.html#a...
« Le shell Unix devrait évoluer comme Perl 5, avec des options de mise à niveau compatibles, et non comme un big bang à la Perl 6/Raku » : https://www.oilshell.org/blog/2020/07/blog-roadmap.html#the-...
Tour d’horizon de YSH : https://www.oilshell.org/release/latest/doc/ysh-tour.html
Cela peut ne pas sembler être un gros avantage tant qu’on n’a pas travaillé dans un environnement où l’on ne peut rien installer depuis Internet, voire qui n’a aucun accès à Internet
Le problème central quand on écrit de gros programmes en scripts Bash, c’est que le langage de script shell n’a pas été conçu à l’origine pour gérer la complexité
Il est excellent pour orchestrer de petites commandes et assembler rapidement des outils existants de façon exploratoire, mais dès qu’un script Bash dépasse quelques centaines de lignes, les limites qui rendent la maintenance à long terme et l’évolutivité pénibles commencent à s’enchaîner
D’abord, il y a le problème de la lisibilité. La syntaxe de Bash peut devenir vraiment opaque à mesure que le projet grossit. Les règles de portée des variables sont subtiles, la gestion des erreurs est primitive, et la manipulation des chaînes devient vite brouillonne. Au final, les mainteneurs perdent du temps à déchiffrer ce qui se passe et ont du mal à modifier quoi que ce soit avec confiance
Ensuite, il manque des outils robustes. Les langages plus mûrs disposent d’outils d’analyse statique, de linters et de débogueurs qui attrapent tôt les erreurs courantes. En Bash, ces outils sont absents ou très limités. Sans ces garde-fous, les gros programmes Bash sont plus exposés aux erreurs silencieuses, aux régressions et aux bugs subtils
Les tests posent aussi problème. Il est possible de tester des scripts Bash, mais le processus est généralement plus fastidieux, et cela devient encore plus délicat en présence de logique complexe ou de structures de données. Dès qu’il faut gérer des cas limites comme les espaces dans les noms de fichiers ou des conditions d’environnement inattendues, on se retrouve avec une montagne de code défensif pénible à valider
Enfin, l’écosystème lui-même n’a pas été conçu pour le développement Bash à grande échelle. On perd la modularité, la gestion de paquets, le traitement standardisé des dépendances et les modèles de développement modernes qu’offrent Python ou Go. Avec le temps, ces manques s’accumulent et finissent par ralentir le travail
Utiliser Bash pour des tâches ponctuelles ou une automatisation simple, c’est très bien. C’est ce que Bash fait bien. Mais si l’on envisage de construire quelque chose de volumineux, il vaut généralement mieux utiliser un langage pensé pour créer et maintenir des applications complexes, même si la courbe d’apprentissage ou la configuration initiale est un peu plus élevée, car cela fait gagner du temps sur le long terme
Utiliser ShellCheck comme linter permet d’éviter beaucoup de pièges courants. Bash/le shell regorge vraiment de pièges et de comportements inattendus, au point que même des auteurs Bash expérimentés peuvent s’y faire prendre
Cela dit, Bash/le shell occupe une place particulière dans la hiérarchie des langages. Il est presque partout, et il y a de fortes chances qu’il soit encore là dans 30 ans. Si vous voulez un programme qui s’exécute presque partout et qui s’exécutera encore dans 30 ans, le shell/Bash est un bon choix
Ce n’est même pas un script écrit il y a très longtemps, et je ne sais pas pourquoi Bash a été choisi. Le script fonctionne, mais on a l’impression que quelque chose va casser rien qu’en regardant le code de travers
-xLe plus gros programme shell écrit à la main que j’ai probablement utilisé régulièrement autrefois, c’était abcde (A Better CD Encoder), avec environ 5 500 lignes
https://abcde.einval.com
https://git.einval.com/cgi-bin/gitweb.cgi?p=abcde.git;a=blob...
Beaucoup de ces programmes sont de véritables bijoux. Par exemple, le script rkhunter est bien écrit, présente une marge d’amélioration et constitue aussi une mine d’informations
Une grande partie de la taille du code de ce type de scripts sert à garantir la présence des utilitaires nécessaires sur différentes plateformes, ainsi que leur comportement conforme aux attentes avec diverses options en ligne de commande. C’est le point le plus pénible pour les auteurs de scripts shell sérieux, plus encore que les signaux et les sous-processus
Si rkhunter avait été écrit dans un « vrai » langage de programmation, ces informations auraient probablement été moins transparentes. Elles auraient pu être enfouies sous forme d’enregistrements dans des structures de données puis consultées, ou manipulées via plusieurs fonctions sur des structures imbriquées, ou pire encore, par une combinaison de méthodes et de classes. Les journaux auraient aussi pu être découpés en JSON et compressés dans une base de données, accessibles seulement via d’autres méthodes
Comme les scripts shell ne disposent pas de ce genre d’outils complexes, ils ont plutôt tendance à montrer directement ce qui se passe. C’est aussi pour cela que rkhunter fait office de bonne documentation sur divers exploits et rootkits, sans qu’il soit nécessaire de creuser de fichier en fichier, de structure en structure, ou de base de données en base de données
Le client FreeBSD Update représente environ 3 600 lignes de code sh
Ce n’est pas énorme comparé aux autres programmes mentionnés ici, mais en termes de fonctionnalités, « un outil qui met à jour tout le système d’exploitation », c’est tout de même assez lourd. Le code qui construit les mises à jour est réparti sur plusieurs fichiers, donc le total serait plus élevé
poudrierereprésente environ trois clients FreeBSD Update en code sh : https://github.com/freebsd/poudriere/blob/master/src/share/p...« Seulement » 7,1 milliers de lignes, mais l’un de mes préférés est le script acme.sh utilisé pour émettre et renouveler les certificats de Let’s Encrypt
https://github.com/acmesh-official/acme.sh/blob/master/acme....
Parfois, le shell est la seule chose dont on peut garantir la disponibilité, et il existe aussi des situations où la portabilité est indispensable
Mais en général, si vous avez une énorme application shell, il faudrait peut-être reconsidérer vos choix de vie
Et en plus, on ne peut généralement pas faire grand-chose avec le shell seul : il faut des commandes comme
find,grep,sed,cat,head,tail,cut. Ces commandes ont elles aussi leurs propres problèmes de portabilitéViser BusyBox est peut-être la meilleure option, mais dès qu’on sort d’un système Linux standard, écrire un script Bourne shell portable devient difficile, voire presque impossible
Avec un compilateur C, on peut déjà sortir du shell, écrire un programme en C que les scripts shell assembleront, ou installer un meilleur langage de script comme Lua. À ce stade, les cas où l’on doit absolument n’utiliser que le shell me paraissent assez niche