42 votes

Pourquoi l'écho ne prend-il pas en charge "\e" (échappement) lors de l'utilisation de l'argument -e dans MacOSX

Lorsque j'essaie d'imprimer du texte coloré en utilisant des séquences d'échappement ANSI via la commande echo intégrée, il semble que la séquence d'échappement \e dans la chaîne que je fournis soit interprétée littéralement au lieu de comme l'"échappement" qu'elle est censée représenter. Cela se produit uniquement dans Snow Leopard - les exemples ci-dessous fonctionnent comme prévu dans Leopard.

Apparemment, echo prend en charge l'option -e car il interprète correctement \n lorsqu'elle est utilisée :

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"

~ $ 

Mais lorsque j'essaie d'utiliser \e, j'obtiens ceci :

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

Comme je l'ai dit, dans Leopard, le résultat ci-dessus me donnerait la chaîne "COLORS" en couleur.

Est-ce que quelqu'un sait pourquoi cela pourrait être un changement intentionnel ? Et avez-vous une solution de contournement pour imprimer des séquences d'échappement ANSI à partir de scripts Bash sur Snow Leopard ?

La version de shell Bash sur mon ordinateur Leopard est 3.2.17(1)-release et 3.2.48(1)-release sur mon ordinateur Snow Leopard.

52voto

gz. Points 1979

Essayez \x1B au lieu de \e.

27voto

Thomas Points 715

Je ne peux pas vous dire pourquoi cela ne prend pas en charge cet argument (vous devrez peut-être demander aux programmeurs à ce sujet). Je sais seulement que sur mon boîtier linux, j'obtiens ceci:

$ /bin/echo --help
Utilisation : /bin/echo [SHORT-OPTION]... [CHAÎNE]...
  ou :  /bin/echo LONG-OPTION
Écho de la/les CHAÎNE(s) sur la sortie standard.

  -n             ne pas afficher le saut de ligne final
  -e             activer l'interprétation des échappements de barre oblique
  -E             désactiver l'interprétation des échappements de barre oblique (par défaut)
      --help     afficher cette aide et quitter
      --version  afficher les informations de version et quitter

Si -e est en vigueur, les séquences suivantes sont reconnues:
  \0NNN   le caractère dont le code ASCII est NNN (octal)
  \\     barre oblique
  \a     alerte (BEL)
  \b     retour arrière
  \c     ne produit pas de sortie supplémentaire
  \f     saut de page
  \n     nouvelle ligne
  \r     retour chariot
  \t     tabulation horizontale
  \v     tabulation verticale

REMARQUE : votre shell peut avoir sa propre version de echo, qui remplace généralement
la version décrite ici. Veuillez vous référer à la documentation de votre shell
pour plus de détails sur les options qu'il prend en charge.

Signaler les bugs de echo à bug-coreutils@gnu.org
Page d'accueil de coreutils GNU : 
Aide générale sur l'utilisation des logiciels GNU : 
Signaler les bugs de traduction de echo à 
  • cela ne mentionne pas les échappements \e
  • il dit que c'est /bin/echo des coreutils GNU. Comme apple modifie de temps en temps la source de leurs composants unix (par exemple, passer de zsh à bash), vérifiez s'il y a eu un changement pour /bin/echo entre Leopard et Snow Leopard. S'il s'agit de gnu, vous pouvez demander aux gens de gnu.org pourquoi ils ont choisi de ne pas inclure ces séquences.

En ce qui concerne les solutions de contournement (plus intéressant) : Ne pas utiliser /bin/echo, mais l'echo intégré de bash fonctionne sur les boîtiers linux. S'ils ont changé pour un bash sans echo intégré (ou quelque chose de plus obscur), vous pouvez également essayer cette fonctionnalité peu connue de votre shell (fonctionne au moins dans bash et zsh) :

$ echo $'\e[34m''COULEURS'

Voici la partie correspondante de la page man de bash :

   Les mots de la forme $'chaîne' sont traités spécialement. Le mot se développe en chaîne, avec
   les caractères échappés par barre oblique remplacés comme spécifié par la norme ANSI
   C. Les séquences d'échappement de barre oblique, si présentes, sont décodées comme suit :
          \a     alerte (cloche)
          \b     retour arrière
          \e     un caractère d'échappement
          \f     saut de page
          \n     nouvelle ligne
          \r     retour chariot
          \t     tabulation horizontale
          \v    (tabulation vertical
          \\     barre oblique
          \'     apostrophe simple
          \nnn   le caractère octal dont la valeur est la valeur octale nnn (un à trois
                 chiffres)
          \xHH   le caractère octal dont la valeur est la valeur hexadécimale HH (un ou
                 deux chiffres hexadécimaux)
          \cx    un caractère de contrôle-x

   Le résultat étendu est entre simples quotes, comme si le signe dollar n'avait pas été présent.

   Une chaîne doublement citée précédée d'un signe dollar ($) entraînera la traduction de la chaîne
   selon le paramétrage local actuel. Si le paramétrage local actuel est C ou POSIX, le signe dollar
   est ignoré. Si la chaîne est traduite et remplacée, le remplacement est entre guillemets doubles.

16voto

mihi Points 3327

Est-ce que \033 fonctionne toujours? Sinon, vous pouvez espérer appuyer sur Ctrl+V suivi de la touche Echap (si un mac possède ces touches) pour créer un vrai caractère de contrôle à l'intérieur de la ligne de commande (ce qui ne fonctionne pas si bien dans les scripts bien sûr, en fonction de l'éditeur)

11voto

Evan Points 1318

Une autre façon d'imprimer des séquences d'échappement ANSI dans la console est d'utiliser /usr/bin/printf.

8voto

mklement0 Points 1744

Pour compléter les réponses utiles existantes avec quelques informations de base :

Si vous appelez echo par nom seulement - par opposition à son chemin, /bin/echo - vous appelez le builtin Bash plutôt que l'utilitaire externe.

Le comportement des éléments natifs Bash tels que les builtins est généralement portable dans le sens Bash, ce qui signifie qu'ils devraient fonctionner de la même manière sur n'importe quelle plateforme capable d'exécuter Bash.

\e est une exception curieuse qui affecte les versions 3.x de Bash sur macOS (à ce jour, en date de la version 10.13.5 (High Sierra), macOS est livré avec des versions obsolètes 3.x de Bash, pour des raisons légales).

\e (et son alias \E) devrait fonctionner avec echo -e; le support de \e a été ajouté au builtin echo dans Bash 2.0., mais inexplicablement ne fonctionne pas dans la version stock 3.x sur macOS.

\e fonctionne dans les versions 3.x de Bash sur d'autres plateformes, comme MSYS sur Windows.

Inversement, si vous installez et utilisez un Bash 4.x sur macOS, \e fonctionne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X