Unterstützen andere Shells als Bash und Zsh ANSI-C-Zitate? zB $ 'string'


13

Ich habe ein Shell-Skript, das Folgendes verwendet, um ein grünes Häkchen in seiner Ausgabe zu drucken:

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

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

Nachdem ich über Bashs ANSI-C-Zitat gelesen hatte , wurde mir klar, dass ich es beim Festlegen meiner Farbvariablen verwenden und das -eFlag aus meinem Echo entfernen konnte .

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

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

Dies scheint ansprechend zu sein, da die Nachricht korrekt gedruckt wird, unabhängig davon, ob sie an Bashs eingebautes Echo oder an das externe Dienstprogramm /bin/echo(ich bin unter macOS) übergeben wird.

Aber macht dies das Skript weniger portabel? Ich weiß, dass Bash und Zsh diese Art des Zitierens unterstützen, aber ich bin mir bei anderen nicht sicher.


Ja, seit wann unterstützen es nur ksh und seine Variationen. Aber IIRC, ANSI-C-Zitate werden in der nächsten POSIX-Spezifikation enthalten sein.
Cuonglm

Antworten:


12

$'…'ist eine ksh93-Funktion, die auch in zsh, bash, mksh, FreeBSD sh und in einigen Builds von BusyBox sh (BusyBox ash mit ENABLE_ASH_BASH_COMPAT) enthalten ist. Es ist noch nicht in der POSIX sh-Sprache vorhanden. Zu den gängigen Bourne-ähnlichen Shells, die es nicht haben, gehören Dash ( /bin/shunter anderem standardmäßig unter Ubuntu), ksh88, die Bourne-Shell, NetBSD sh, yash, andere pdksh-Derivate als mksh und einige Builds von BusyBox.

Eine tragbare Methode, um Backslash-Buchstaben und Backslash-Oktale als Steuerzeichen zu analysieren, ist die Verwendung printf. Es ist auf allen POSIX-kompatiblen Systemen vorhanden.

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

Beachten Sie, dass \enicht tragbar ist. Es wird von vielen Implementierungen von, printfaber nicht von der in dash¹ unterstützt. Verwenden Sie stattdessen den Oktalcode.

¹ Es wird in Debian und Derivaten unterstützt, die mindestens 0,5,8-2,4 liefern, z. B. seit Debian Stretch und Ubuntu 17.04.


Sind Sie sicher \e, dass Sie nicht unterstützt werden dash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'wird printf is a shell builtinhier fett rot gedruckt (Bindestrich-0.5.8). Eine Shell, die nicht unterstützt wird, \eist yash.
Mosvy

@ Mosvy Druckt \e[1;31mprintf is a shell builtin \e[mhier. Ubuntu 16.04, Bindestrich 0.5.8-2.1ubuntu2. Druckt in Rot unter Ubuntu 18.04 mit Bindestrich 0.5.8-2.10. Ubuntu hat anscheinend einen Patch erstellt, um dies zu unterstützen.
Gilles 'SO - hör auf böse zu sein'

Ja, tut mir leid, es sieht so aus, als wäre das ein Debian-Patch (9,7 Stretch). Hier ist das Original.
Mosvy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.