ANSI-Cの引用をサポートするシェルは何ですか?たとえば、$ 'string'

ANSI-Cの引用をサポートするシェルは何ですか?たとえば、$ 'string'

次のコマンドを使用して、出力に緑色のチェックマークを印刷するシェルスクリプトがあります。

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

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

バッシュを読んだ後ANSI-Cの引用、カラー変数を設定するときに使用できることに気づきました-eエコ

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

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

これは、メッセージがBashの組み込み機能に転送されるかどうかに関係なく正しく印刷されることを意味するので、魅力的に見えます。エコまたは外部ユーティリティ/bin/echo(私はmacOSを使用しています)。

しかし、これはスクリプトの移植性を低下させますか? BashとZshがこの引用スタイルをサポートしていることは知っていますが、他のものはよくわかりません。

答え1

$'…'zsh、bash、mksh、FreeBSD sh、およびBusyBox shの一部のバージョンにも存在するksh93機能です(BusyBox ashはそれを使用して構築されていますENABLE_ASH_BASH_COMPAT)。 POSIX sh 言語にはまだ存在しません。ダッシュ(/bin/shUbuntuなどではデフォルトでは)、ksh88、Bourneシェル、NetBSD sh、yash、mkshを除くpdksh派生、およびBusyBoxの一部のバージョンを含む一般的なBourne様シェルにはこの機能はありません。

バックスラッシュ文字とバックスラッシュの8進数を制御文字として解析するための移植可能な方法は、次のものを使用することです。printf。すべてのPOSIX互換システムに存在します。

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

携帯できませんのでご注意ください\e。多くの実装がこれをサポートしていますprintfが、dash1の実装はサポートしていません。代わりに8進コードを使用してください。

¹Debian StretchとUbuntu 17.04で始まるDebianおよび最小バージョン0.5.8-2.4の派生バージョンでサポートされています。

答え2

$'...'移植の際のサポートレベルも考慮する必要があります。これPOSIX FolksはこれをPOSIX shに入れることを提案しました。特に一つ:

ステファン:ksh93はシェル$ '...'です(while $'\uxxxx'[そして$'\Uxxxxxxxx'] zshから:http://www.zsh.org/mla/workers/2003/msg00223.html)[^]

私がDebian Bullseyeから得たものを見ると、これがこの新しいディストリビューションで得られる唯一の「公式」Kornシェルであることがksh2020わかります。$'\U1F600'

mksh解析しましたが、U+FFFEで完全に混乱しました。構文エラーについて文句を言わないので、Unicodeの理解に問題があるようです。$'\U01F60'非常によく処理されます。

関連情報