BashとZsh以外のシェルはANSI-Cクォートをサポートしていますか?例:$ 'string'


13

出力に緑色のチェックマークを出力するために次を使用するシェルスクリプトがあります。

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

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

BashのANSI-C Quotingについて読んだ後、色変数を設定-eし、echoからフラグを削除するときに使用できることに気付きました。

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

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

これは、Bashの組み込みエコーまたは外部ユーティリティ/bin/echo(私はmacOS上にある)に渡されたメッセージが正しく印刷されることを意味するため、魅力的です。

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


はい、現時点ではkshとそのバリエーションのみがサポートされているためです。しかし、IIRC、ANSI-Cの引用は、次のPOSIX仕様に含まれる予定です。
クオンルム

回答:


12

$'…'zsh、bash、mksh、FreeBSD sh、およびBusyBox shの一部のビルド(BusyBox ashでビルドENABLE_ASH_BASH_COMPAT)にも存在するksh93機能です。POSIX sh言語にはまだありません。それを持たない一般的なBourneのようなシェルには、ダッシュ(特に/bin/shUbuntuではデフォルト)、ksh88、Bourneシェル、NetBSD sh、yash、mksh以外のpdkshの派生物、およびBusyBoxのいくつかのビルドが含まれます。

制御文字としてバックスラッシュ文字とバックスラッシュ8進数を解析するポータブルな方法は、を使用することprintfです。すべてのPOSIX準拠システムに存在します。

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

\eポータブルではないことに注意してください。多くの実装でサポートされていますがprintf、ダッシュ¹の実装ではサポートされていません。代わりに8進コードを使用してください。

¹ これはDebianのストレッチとUbuntu 17.04以降例えば、船少なくとも0.5.8-2.4ことをDebianとデリバティブでサポートされています。


\eでサポートされていませんdashか?dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'印刷されprintf is a shell builtin、ここで赤色の太字で(ダッシュ-0.5.8)。サポートされていないシェル\eyashです。
mosvy

@mosvyの印刷は\e[1;31mprintf is a shell builtin \e[mこちら。Ubuntu 16.04、ダッシュ0.5.8-2.1ubuntu2。Ubuntu 18.04ではダッシュ0.5.8-2.10で赤く印刷されます。Ubuntuはそれをサポートするパッチを作成したようです。
Gilles「SO-邪悪なことをやめ

ええ、申し訳ありませんが、それはdebian(9.7ストレッチ)パッチのようです。こちらがオリジナルです。
mosvy

0

$'...'移植時にはサポートの程度も考慮する必要があります。これをPOSIX shに入れるというPOSIX Folksの提案では、特に次のように述べています。

stephane:ksh93はシェルです$ '...'は($'\uxxxx'[ $'\Uxxxxxxxx' ]はzshから来ますhttp ://www.zsh.org/mla/workers/2003/msg00223.html )[^]

私のDebianブルズアイで得たものksh2020から、AT&Tはを理解してい$'\U1F600'ます。これは、この新しいディストリビューションで入手できる唯一の「公式」Kornシェルです。

mksh解析しましたが、U + FFFEで完全に失敗しました。構文エラーについて文句を言わなかったので、Unicodeの理解に問題があるはずです。それは$'\U01F60'うまく処理します。


残念ながら、最近のクーデターの影響としてksh2020は消えました。しかし、はい、元のksh93はサポートして$'...'おり、IIRCが最初にサポートしました。
モスビー

@ Arthur2e5。ksh2020AT&Tからではありません。Red Hatの1人である数人が本質的に数年前にAT&T AST githubツリーをハイジャックし、将来のksh93開発の制御を主張しました
fpmurphy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.