Squelette de script bash

Décrivez le script : ses options, ses arguments, les garde-fous voulus. L’outil écrit un squelette propre et commenté (mode strict, --help, options courtes et longues, nettoyage des fichiers temporaires) : il ne reste que le cœur du script à écrire.

Le script
Options

Nom court (-o), nom long (--output), nom de la valeur si elle en prend une (FILE ; vide : un interrupteur), valeur par défaut, description. -h, --help est toujours présent.

    Arguments

    Ce qui suit les options, dans l’ordre : les obligatoires d’abord ; seul le dernier peut prendre plusieurs valeurs (une liste de fichiers, par exemple).

      Garde-fous
      
          
      Ensuite, pour le lancer
      
        

      Les choix du squelette

      #!/usr/bin/env bash
      Trouve bash où qu’il soit installé (/bin/bash sous Linux, /opt/homebrew/bin/bash sur un Mac avec Homebrew).
      Pas de getopt
      Les options sont lues par un while et un case, et non par getopt : celui de macOS ne connaît pas les options longues, et getopts ne connaît que les courtes. Limite : les options courtes ne se groupent pas (-v -n, pas -vn).
      bash 3.2
      Rien de plus récent que le bash livré avec macOS : ni mapfile, ni tableau associatif, et des tableaux vides écrits pour que set -u ne s’y arrête pas.
      Messages sur stderr
      Pour que la vraie sortie du script puisse partir dans un tube ou un fichier sans les messages mêlés.

      Transparence

      Le squelette est écrit dans votre navigateur, par les scripts listés ci-dessous. Rien de ce que vous saisissez ne quitte cette page.

      Garanti par votre navigateur
      La politique de sécurité du contenu (CSP) de cette page n’autorise qu’une destination, la mesure d’audience du site (connect-src https://stats.r-no.fr, voir plus bas), et interdit tout envoi de formulaire (form-action 'none') : même un bogue ne pourrait envoyer nulle part ce que vous saisissez. Vous pouvez lire cette politique en haut du code source de la page.
      Mesure d’audience
      Comme toutes les pages du site, celle-ci compte sa visite avec Umami, installé sur le serveur de R-no lui-même (stats.r-no.fr). Il reçoit l’adresse de la page, sans paramètres ni ancre, le site d’où vous venez (son nom de domaine seulement), votre navigateur, votre système, votre langue et la taille de votre écran, ainsi que le pays, la région et la ville déduits de votre adresse IP, qui n’est pas conservée. Il ne reçoit jamais ce que vous saisissez, ni le résultat de l’outil. Aucun cookie, rien d’enregistré dans votre navigateur ; si votre navigateur demande à ne pas être suivi (Do Not Track), rien n’est mesuré. Les données sont effacées au bout de 25 mois.
      • /commun/mesure.js : le filtre appliqué avant chaque envoi, écrit pour R-no Toolbox. 1.4 kB
        SHA-256 225eec74fd12623d82fc05ee7d222be629ce454d081c129e8d1e249ed37ee716
      • https://stats.r-no.fr/m.js : le script de suivi d’Umami, libre (MIT), servi par le serveur de mesure. Son empreinte n’est pas affichée ici : elle change à chaque version d’Umami, et vous ne pouvez pas vérifier depuis votre navigateur qu’il s’agit du code publié. Pour cette partie, il faut faire confiance à R-no.
      Ce qui est conservé
      Aucun cookie, et rien dans l’adresse. Ce que vous saisissez n’est jamais conservé : tout disparaît quand vous rechargez ou fermez la page. La langue est donnée par l’adresse elle-même (/en/ ou /fr/) : rien n’est conservé pour s’en souvenir. Comme tout site web, le serveur note le téléchargement de la page et de ses fichiers dans ses journaux d’accès (adresse IP, date et heure, adresse demandée, nom du navigateur). Il ne reçoit jamais ce que vous saisissez.
      Le code qui s’exécute ici
      • app.js: les contrôles et l’écriture du squelette, écrits pour R-no Toolbox. Non minifié, sans bibliothèque tierce. 23.3 kB
        SHA-256 f55c36e973bf9df0f221b66d2982e2123ca183e6ff7766a4f27658f5b3056721
      • textes.js: les messages en français de l’outil, affichés par son script (le reste de la page française est écrit dans son HTML à la construction du site). Il ne fait que définir des textes, sans aucune logique. 10.6 kB
        SHA-256 ff50efd7cd6728a765d5d8e00b2b1e5528a049e85f4720eb094c71912c4aac26
      • /commun/langue.js: l’aide à la traduction, la même sur toutes les pages du site. Elle lit la langue de la page et donne à l’outil ses messages dans cette langue. Elle ne conserve rien. 1.6 kB
        SHA-256 80f76f69773ef628d36d09bf8387cfedebda4529210d7120649b6f5603310631
      Avant de coller
      Cette page ne fait qu’écrire du texte : elle n’exécute rien, ni ici ni sur votre machine. Ce que vous collez dans un terminal ou un fichier de configuration s’exécute avec vos droits : relisez-le d’abord. Le code qu’elle écrit ne télécharge rien et n’appelle aucun service extérieur.
      Comment c’est vérifié
      Des squelettes avec et sans chaque garde-fou, avec des valeurs d’option pleines d’apostrophes et des messages dans les deux langues, passent ShellCheck et ont été lancés avec bash 5.2 : --help, valeur manquante, option inconnue, trop d’arguments, --, --output=…. Le code évite tout ce qui est plus récent que bash 3.2, mais n’a pas été lancé sur bash 3.2 lui-même.
      Vérifiez vous-même
      Téléchargez un script et comparez son empreinte avec celle affichée ci-dessus :
      curl -s https://r-no.fr/bash/script/app.js | shasum -a 256
      Limites
      Un squelette, pas un script fini : le travail lui-même vous revient. Les options courtes ne se groupent pas (-vn). Les messages du script sont écrits dans la langue de cette page. set -e a des angles morts connus (dans un if, un &&, un || ou une substitution de commande) : c’est un filet, pas une garantie.