Les shells autres que Bash et Zsh prennent-ils en charge les cotations ANSI-C? par exemple $ 'string'

13

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 -edrapeau 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.

ivan
la source
Oui, depuis quand seuls ksh et ses variantes le supportent pour l'instant. Mais la cotation IIRC, ANSI-C sera dans la prochaine spécification POSIX.
cuonglm
ksh doc: debian ksh (1)
Arthur2e5

Réponses:

12

$'…'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 avec ENABLE_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/shpar 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.

esc=$(printf '\033') # assuming an ASCII (as opposed to EBCDIC) system
col_green="${esc}[32;01m"

Notez que ce \en'est pas portable. Il est pris en charge par de nombreuses implémentations de printfmais 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.

Gilles 'SO- arrête d'être méchant'
la source
êtes-vous sûr de \ene pas être pris en charge dans dash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'sera imprimé printf is a shell builtinen rouge gras ici (tiret-0.5.8). Un shell qui ne prend pas en charge \eest yash.
mosvy
@mosvy Imprime \e[1;31mprintf is a shell builtin \e[mici. 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.
Gilles 'SO- arrête d'être méchant'
Oui, désolé, il semble que ce soit un patch Debian (9.7 stretch). voici l'original.
mosvy
0

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:

stephane: ksh93 est le shell $ '...' vient de (tandis que $'\uxxxx'[ et$'\Uxxxxxxxx' ] vient de zsh: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

D'après ce que je suis arrivé ici sur ma bulle Debian, le ksh2020AT&T comprend $'\U1F600'. C'est le seul shell Korn "officiel" que je puisse obtenir sur cette nouvelle distribution.

mkshanalysé 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.

Arthur2e5
la source
Malheureusement, l'effet d'un récent coup d'État ksh2020 a disparu. Mais oui, le ksh93 d'origine prend en charge $'...'et iirc c'est le premier qui l'a fait.
Mosvy
@ Arthur2e5. ksh2020ne 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 du ksh93développement futur
fpmurphy