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 -e
Flag 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.
Antworten:
$'…'
ist eine ksh93-Funktion, die auch in zsh, bash, mksh, FreeBSD sh und in einigen Builds von BusyBox sh (BusyBox ash mitENABLE_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/sh
unter 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.Beachten Sie, dass
\e
nicht tragbar ist. Es wird von vielen Implementierungen von,printf
aber 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.
quelle
\e
, dass Sie nicht unterstützt werdendash
?dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'
wirdprintf is a shell builtin
hier fett rot gedruckt (Bindestrich-0.5.8). Eine Shell, die nicht unterstützt wird,\e
istyash
.\e[1;31mprintf is a shell builtin \e[m
hier. 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.