Lorsque j'essaie d'imprimer du texte coloré à l'aide de séquences d'échappement ANSI via la echo
commande intégrée , il semble que la \e
séquence d'échappement de la chaîne que je fournis soit interprétée littéralement et non comme le "échap" qu'il est censé représenter. Cela ne se produit que dans Snow Leopard - les exemples ci-dessous fonctionnent comme prévu dans Leopard.
Apparemment, echo
prend en charge le -e
commutateur car il interprète correctement \n
lors de son utilisation:
~ $
~ $ echo "\n"
\n
~ $ echo -e "\n"
~ $
Mais quand j'essaye d'utiliser \e
, je reçois ceci:
~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $
Comme je l'ai dit, dans Léopard, ce qui précède me donnerait la chaîne "COULEURS" en couleur.
Quelqu'un sait-il pourquoi ce changement pourrait être envisagé? Que diriez-vous d'une solution de contournement pour imprimer des séquences d'échappement ANSI à partir de scripts Bash sous Snow Leopard?
La version shell Bash sur ma machine Leopard est 3.2.17(1)-release
et 3.2.48(1)-release
sur ma machine Snow Leopard.
Réponses:
Je ne peux pas vous dire pourquoi il ne supporte pas cet argument (vous devrez peut-être demander aux programmeurs à ce sujet). Je sais seulement que sur ma machine Linux, je reçois ceci:
\e
évasions/bin/echo
de gnu coreutils. Apple changeant de temps en temps la source de ses composants système Unix (par exemple, passer de zsh à bash), vérifiez s'il y avait un changement/bin/echo
entre Leopard et Snow Leopard. Si c'est gnou, 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 (c'est plus intéressant): ne pas utiliser
/bin/echo
, mais lesecho
fonctions intégrées de bash fonctionnent sur les boîtes Linux. S'ils changeaient en bash sans écho interne (ou quelque chose d'encore plus obscur), vous pourriez aussi essayer cette fonctionnalité peu connue de votre shell (fonctionne au moins en bash et zsh):Voici la partie correspondante de la page de manuel de bash:
la source
$'string'
la séquence d'échappement était activée, merci.\e
ne fait pas partie du standard POSIX; l'implémentation de GNU coreutils étendue à la norme. OS X n'a pas.Essayez
\x1B
au lieu de\e
.la source
\x1B
au lieu de\e
fonctionne, merci.1B
est la valeur hexadécimale du caractère d'échappement .Fonctionne
\033
toujours? Sinon, vous pouvez appuyer sur Ctrl + V, suivi de la touche Échap (si un mac en a), pour créer un véritable caractère de contrôle dans la ligne de commande (ce qui ne fonctionne bien sûr pas dans les scripts, selon l'éditeur).la source
\033
au lieu de\e
fonctionne, merci.33
est la valeur octale du caractère d'échappement .033
serait un moyen normalisé d’écrire en octal.Une autre façon d’imprimer des séquences d’échappement ANSI dans le shell consiste à utiliser
/usr/bin/printf
.la source
Pour compléter la réponse utile existante avec quelques informations de base :
Si vous appelant
echo
par nom seulement - par opposition à son chemin,/bin/echo
- vous invoquer le Bash builtin plutôt que l'utilitaire externe.Le comportement des éléments Bash natifs tels que les éléments intégrés est généralement portable dans le sens Bash, ce qui signifie qu'ils doivent fonctionner de la même manière sur toute plate-forme capable d'exécuter Bash .
\e
est une exception curieuse qui affecte les versions 3.x Bash sur macOS (à ce jour, à partir de la v10.13.5 (High Sierra), macOS est fourni avec des versions obsolètes de Bash 3.x, pour des raisons juridiques).\e
(et son alias\E
) devrait fonctionner avececho -e
;\e
le support a été ajouté à Bash 2.0echo
intégré . , mais inexplicablement, dans la version stockée 3.x de macOS.\e
fait le travail 3.x versions Bash sur d' autres plates - formes, telles que MSYS sous Windows.Inversement, si vous installez et utilisez un Bash 4.x sous macOS,
\e
cela fonctionnera.la source
Ils pourraient essayer de se conformer à POSIX: http://www.opengroup.org/onlinepubs/9699919799/
La partie OPTIONS indique entre autres:
la source
-e
.FYI, nous sommes sur le point d’ajouter \ e le support de / bin / echo et / usr / bin / printf dans coreutils. Notez que les standards C ne spécifient pas \ e, mais gcc, perl, bash, ksh et tcsh le supportent
la source
Vous pouvez vérifier si les caractères d'échappement "non-ascii" ont été décochés dans le menu des options d'affichage du terminal.app.
la source