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の派生バージョンでサポートされています。

おすすめ記事