Shell diverse da Bash e Zsh supportano la quotazione ANSI-C? ad esempio $ 'stringa'


13

Ho uno script di shell che utilizza quanto segue per stampare un segno di spunta verde nel suo output:

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

Dopo aver letto delle citazioni ANSI-C di Bash , mi sono reso conto che potevo usarlo durante l'impostazione delle mie variabili di colore e rimuovere il -eflag dalla mia eco .

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

Questo sembra interessante, dal momento che significa che il messaggio viene stampato correttamente se viene passato all'eco integrata di Bash o all'utilità esterna /bin/echo(sono su macOS).

Ma questo rende lo script meno portatile? So che Bash e Zsh supportano questo stile di quotazione, ma non sono sicuro degli altri.


Sì, da quando solo ksh e le sue varianti lo supportano per ora. Ma IIRC, la quotazione ANSI-C sarà nella prossima specifica POSIX.
cuonglm,

Risposte:


12

$'…'è una funzione di ksh93 presente anche in zsh, bash, mksh, FreeBSD sh e in alcune build di BusyBox sh (busyBox ash costruito con ENABLE_ASH_BASH_COMPAT). Non è ancora presente nel linguaggio sh POSIX. Le shell comuni simili a Bourne che non ne hanno includono dash (che è /bin/shdi default su Ubuntu tra gli altri), ksh88, la shell Bourne, NetBSD sh, yash, derivati ​​di pdksh diversi da mksh e alcune build di BusyBox.

È possibile utilizzare un modo portatile per ottenere una barra rovesciata e una barra rovesciata come caratteri di controllo printf. È presente su tutti i sistemi conformi a POSIX.

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

Si noti che \enon è portatile. È supportato da molte implementazioni printfma non da quella in dash¹. Utilizzare invece il codice ottale.

¹ È supportato in Debian e derivati ​​forniti almeno 0.5.8-2.4, ad es. Da Debian stretch e Ubuntu 17.04.


sei sicuro di \enon essere supportato in dash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'verrà stampato printf is a shell builtinin grassetto rosso qui (trattino-0.5.8). Una shell che non supporta \eè yash.
mosvy,

@mosvy Stampa \e[1;31mprintf is a shell builtin \e[mqui. Ubuntu 16.04, trattino 0.5.8-2.1ubuntu2. Stampa in rosso su Ubuntu 18.04 con trattino 0.5.8-2.10. Sembra che Ubuntu abbia creato una patch per supportarla.
Gilles 'SO- smetti di essere malvagio' il

Sì, scusa, sembra che sia una patch debian (9.7 stretch). ecco l'originale.
mosvy,

0

Anche il grado di $'...'supporto deve essere preso in considerazione durante il porting. La proposta della gente di POSIX di metterlo in POSIX ne menziona uno in particolare:

stephane: ksh93 è la shell $ '...' viene (mentre $'\uxxxx'[ e$'\Uxxxxxxxx' ] viene da zsh: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

Da quello che sono arrivato qui sul mio bullseye Debian, l' ksh2020AT & T capisce $'\U1F600'. Questa è l'unica shell Korn "ufficiale" che posso ottenere su questa nuova distribuzione.

mkshlo analizzò, ma lo rovinò completamente con un U + FFFE. Dal momento che non si è lamentato di un errore di sintassi, ci deve essere qualcosa di sbagliato nella sua comprensione di Unicode. Gestisce $'\U01F60'bene.


Sfortunatamente, a causa di un recente colpo di stato, il ksh2020 è scomparso. Ma sì, l'originale ksh93 supporta $'...'e è stato il primo a farlo.
mosvy

@ Arthur2e5. ksh2020non proviene da AT&T. Un paio di persone, una di Red Hat, hanno essenzialmente dirottato l'albero di github AT&T AST alcuni anni fa e hanno rivendicato il controllo dello ksh93sviluppo futuro
fpmurphy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.