3 points par GN⁺ 2023-11-24 | 1 commentaires | Partager sur WhatsApp

Les curieux binaires des systèmes Unix

  • Sur les systèmes Unix, il existe des fichiers binaires dont le nom est un seul symbole.
  • En exécutant la commande /bin/[, on peut constater l’existence d’un programme nommé [.
  • [ et test pointent vers le même fichier binaire, et les deux commandes remplissent en réalité la même fonction.

Utilisation du programme test et de [

  • Le programme test sert à évaluer des expressions dans le shell.
  • Il est utilisé pour comparer des chaînes, comparer des nombres, vérifier des conditions sur des fichiers, etc.
  • test reçoit des arguments, évalue l’expression, puis renvoie 0 si elle est vraie et 1 si elle est fausse.

Pourquoi ces deux commandes existent

  • La raison de l’existence simultanée de test et [ n’est pas clairement établie, mais on suppose que c’est pour améliorer la lisibilité.
  • L’utilisation de [ permet d’exprimer les conditions de manière plus propre qu’avec test.
  • Lorsqu’on utilise [, le dernier argument de la commande doit se terminer par ].

Différence entre commandes intégrées et binaires externes

  • Comme test et [ sont souvent utilisés dans les scripts shell, ils sont implémentés comme commandes intégrées dans la plupart des shells.
  • Le comportement peut différer selon qu’on utilise une commande intégrée ou un binaire externe, et il peut aussi varier d’un shell à l’autre.

Utilisation de [[ et différences

  • [[ est une extension de Bash qui remplace l’usage de [.
  • En tant que commande intégrée, [[ peut modifier les règles de base du langage à l’intérieur des expressions.
  • Lors de comparaisons de chaînes, [[ peut traiter les motifs glob comme des littéraux et produire ainsi des résultats différents.

Choix lors de l’écriture de scripts shell

  • Pour écrire des scripts shell portables, il est préférable d’utiliser [.
  • Pour un script réservé à Bash, [[ offre davantage de fonctionnalités.

Combiner expressions du shell et expressions test

  • Le shell possède ses propres expressions via les opérateurs !, &&, ||.
  • Il est possible de combiner les expressions de test et celles du shell en une seule commande.

Avis de GN⁺

Le point le plus important de cet article est que [ et test existent sur les systèmes Unix comme deux commandes différentes accomplissant la même fonction, vraisemblablement pour améliorer la lisibilité et l’efficacité des scripts shell. Cette information peut être utile aux ingénieurs logiciels débutants lorsqu’ils écrivent ou lisent des scripts shell, et elle aide à mieux comprendre le fonctionnement des scripts shell ainsi que les différences entre les divers shells. Ce qui rend cet article intéressant, c’est qu’il montre comment les outils fondamentaux du shell peuvent être utilisés sous différentes formes, tout en mettant en évidence la complexité et la flexibilité de la programmation shell.

1 commentaires

 
GN⁺ 2023-11-24
Commentaires sur Hacker News
  • Remerciements de l’auteur original et proposition de correction du titre

    L’auteur original remercie pour la popularité de l’article et propose d’ajouter l’année au titre, tout en évitant la majuscule à "test", car "test" désigne ici une vraie commande.

  • Histoire de la commande "test" du shell Bourne et préférence personnelle

    Il explique que le shell Bourne a été conçu à une époque sans IDE, ce qui explique l’usage de la commande "test" sans parenthèses ni crochets. Personnellement, il dit préférer la forme "test" à la syntaxe avec crochets.

  • Exemple de condition sans bloc if

    Il présente une façon d’écrire simplement une condition sans bloc if, avec un exemple où une sortie de debug est affichée conditionnellement sur stderr.

  • Manière de combiner un bloc if avec des commandes ordinaires

    Il montre qu’un bloc if peut tester des commandes ordinaires, en prenant comme exemple une recherche dans les logs avec la commande grep.

  • Réflexion sur l’usage des opérations logiques dans la commande test

    Il exprime son hésitation entre utiliser des opérations logiques dans la commande test ou recourir à des conditions séparées. S’il n’y a pas d’enjeu de performance, les deux approches lui semblent défendables.

  • Avantages de la commande "test" et praticité de "man test"

    Il affirme depuis plusieurs années qu’il vaut mieux utiliser la commande "test" sans crochets. Cela met en avant le fait que "test" est une simple commande, et il explique que consulter "man test" est plus pratique que chercher dans "man bash".

  • Attention au comportement avec un seul argument de [ et test

    Il avertit que, pour vérifier si une variable n’est pas vide, ne pas mettre la variable entre guillemets peut produire des résultats inattendus. Il insiste sur l’importance de toujours la citer.

  • Différence entre /bin/[ et /bin/test sur Linux et NetBSD

    Il partage le fait que sur Linux, /bin/[ et /bin/test sont différents, alors que sur NetBSD ils sont identiques.

  • Partage d’un lien de blog pour approfondir test/[/[[ et les bizarreries du shell

    Il partage un document pour mieux comprendre test, [, [[, ainsi qu’un lien de blog expliquant diverses particularités du shell.

  • Rappel que [[ est spécifique à bash, avec recommandation de l’utiliser si l’on est certain d’être sous bash

    Il précise que [[ est propre à bash et recommande de l’utiliser lorsqu’on sait avec certitude que bash sera utilisé.

  • Confusion autour de l’idée que [ ne ferait pas partie du langage de script bash

    Il dit avoir été déconcerté par l’idée que [ ne fait pas partie du langage de script bash mais n’est qu’un simple programme, et demande des explications à ce sujet.

  • Opinion tranchée sur le shell et opposition à l’usage de [

    Il exprime l’avis ferme qu’il ne faut pas utiliser [ mais uniquement "test". Il souligne que [ donne l’impression d’être de la syntaxe du langage alors qu’il s’agit en réalité d’un programme, et affirme qu’il faudrait utiliser l’instruction case pour l’évaluation des chaînes.