Aller au contenu

moreutils

À quoi il sert

moreutils, rassemblé par Joey Hess, réunit des outils qui manquaient à la boîte de base, chacun très court. Le plus utilisé est sponge : il lit toute son entrée avant d'ouvrir le fichier de destination, ce qui permet d'écrire jq '.version = "1.4.1"' config.json | sponge config.json, là où une redirection > config.json viderait le fichier avant que jq ne l'ait lu. Les autres : ts horodate chaque ligne d'un flux, chronic n'affiche la sortie d'une commande que si elle échoue (idéal pour cron), ifne ne lance une commande que si son entrée n'est pas vide, vipe insère un éditeur au milieu d'un tube, pee duplique un flux vers plusieurs commandes, errno traduit les codes d'erreur système. Debian 13 et Ubuntu 24.04 (dépôt universe) fournissent la version 0.69.

Quand le choisir

Sur un poste de travail ou dans une image de CI, pour des scripts plus lisibles. Sur un serveur, chaque paquet ajouté doit être justifié : pour réécrire un fichier, la méthode sans dépendance (écrire dans un fichier temporaire du même répertoire, vérifier, puis mv) est à peine plus longue, garantit l'écriture atomique et ne remplace rien si la commande a échoué.

Points d'attention

  • sponge écrit d'abord dans un fichier temporaire de TMPDIR (/tmp par défaut), puis tente de le renommer sur la destination en reprenant ses droits. Si /tmp est sur un autre système de fichiers (un tmpfs, par défaut sur Debian 13), le renommage échoue et sponge recopie le contenu dans le fichier existant : l'écriture n'est plus atomique, et une interruption peut laisser un fichier tronqué. Avec TMPDIR placé sur le même système de fichiers que la cible, le renommage réussit.
  • sponge ne sait pas si la commande qui l'alimente a échoué : jq ... config.json | sponge config.json remplace le fichier par un fichier vide si jq rejette le document, même sous set -o pipefail, puisque sponge a déjà écrit quand le shell découvre l'échec. Préférez un fichier temporaire du même répertoire, le contrôle du code de sortie, puis mv.
  • Toute l'entrée est gardée en mémoire (ou dans un fichier temporaire au-delà d'une certaine taille).
  • Le paquet installe une commande parallel qui n'est pas GNU parallel, source de confusion quand les deux coexistent.

Par où commencer

La leçon jq : transformer, produire du JSON et choisir son outil du cours Traiter du texte, qui compare sponge et le couple fichier temporaire plus mv, puis la page du projet et les pages de manuel de chaque outil.