J'ai un script shell qui utilise ce qui suit pour imprimer une coche verte dans sa sortie:
col_green="\e[32;01m"
col_reset="\e[39;49;00m"
echo -e "Done ${col_green}✓${col_reset}"
Après avoir lu sur la citation ANSI-C de Bash , j'ai réalisé que je pouvais l'utiliser lors de la définition de mes variables de couleur et supprimer le -e
drapeau de mon écho .
col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'
echo "Done ${col_green}✓${col_reset}"
Cela semble attrayant, car cela signifie que le message s'imprime correctement, qu'il soit transmis à l' écho intégré de Bash ou à l'utilitaire externe /bin/echo
(je suis sur macOS).
Mais cela rend-il le script moins portable? Je sais que Bash et Zsh supportent ce style de citation, mais je ne suis pas sûr des autres.
Réponses:
$'…'
est une fonctionnalité ksh93 qui est également présente dans zsh, bash, mksh, FreeBSD sh et dans certaines versions de BusyBox sh (BusyBox ash construit avecENABLE_ASH_BASH_COMPAT
). Il n'est pas encore présent dans le langage POSIX sh. Les shells similaires à Bourne qui ne l'ont pas incluent dash (qui est/bin/sh
par défaut sur Ubuntu entre autres), ksh88, le shell Bourne, NetBSD sh, yash, les dérivés de pdksh autres que mksh et quelques builds de BusyBox.Une méthode portable pour obtenir une contre-oblique et une antislash-octal analysées en tant que caractères de contrôle est d'utiliser
printf
. Il est présent sur tous les systèmes compatibles POSIX.Notez que ce
\e
n'est pas portable. Il est pris en charge par de nombreuses implémentations deprintf
mais pas par celle du tableau de bord¹. Utilisez plutôt le code octal.¹ Il est pris en charge dans Debian et les dérivés livrés au moins 0.5.8-2.4, par exemple depuis Debian stretch et Ubuntu 17.04.
la source
\e
ne pas être pris en charge dansdash
?dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'
sera impriméprintf is a shell builtin
en rouge gras ici (tiret-0.5.8). Un shell qui ne prend pas en charge\e
estyash
.\e[1;31mprintf is a shell builtin \e[m
ici. Ubuntu 16.04, tiret 0.5.8-2.1ubuntu2. Imprime en rouge sur Ubuntu 18.04 avec le tiret 0.5.8-2.10. On dirait qu'Ubuntu a fait un patch pour le supporter.Le degré de
$'...'
support doit également être pris en compte lors du portage. La proposition de POSIX Folks de mettre cela dans POSIX sh en mentionne une en particulier:D'après ce que je suis arrivé ici sur ma bulle Debian, le
ksh2020
AT&T comprend$'\U1F600'
. C'est le seul shell Korn "officiel" que je puisse obtenir sur cette nouvelle distribution.mksh
analysé mais complètement bâclé avec un U + FFFE. Puisqu'il ne s'est pas plaint d'une erreur de syntaxe, il doit y avoir quelque chose de mal avec sa compréhension d'Unicode. Il gère$'\U01F60'
très bien.la source
$'...'
et iirc c'est le premier qui l'a fait.ksh2020
ne vient pas d'AT & T. Deux personnes, dont une de Red Hat, ont essentiellement détourné l'arbre de github AT&T AST il y a quelques années et ont revendiqué le contrôle duksh93
développement futur