端末でサポートされているANSIエスケープコードをプログラムで検出します。

端末でサポートされているANSIエスケープコードをプログラムで検出します。

私はANSIコードを使用してシェルスクリプトを操作しており、何らかの理由でターミナル/ OSによって異なるエスケープコードがサポートされていることを発見しました。

場合によっては、誤って解析されなかったガベージダンプが得られましたが、これは私の端末(Mac OS)が使用されたエスケープコードをサポートしていないことを意味します。いくつかの場所でこのコードが意味するものを読んだにもかかわらず、同じ内容:

27 = 033 = 0x1b = ^[ = \e

検索して発見したスラッシュエスケープサポートの検出に関するこの質問

選択した回答スニッフィング$TERM検出する値

case $TERM in
  (|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
    PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac

しかし、これがどれほど信頼できるのか疑問に思います。

エスケープコードのサポート(主にBash用)を確認する標準的な方法はありますか?それとも、このスクリプトはほぼ日常的ですか?

  • または、最も広範なサポートを「保証」するためにどのエスケープコードを使用できますか?
  • echo拡張-eはどうですか?
  • 移植性/有用性/配布の面で一般的なベストプラクティスは何ですか?スクリプト使用または参照制御コードはどうですか?

これは読みやすい情報を見つける他の人のため。

答え1

具体的な措置がありますか?

以下は使用例です。ハイライトモード、多くの端末で顕著な結果を提供します。

tput smso; echo hello, world; tput rmso

このtputツールは、環境変数の値を使用して、$TERM出力するエスケープシーケンス(存在する場合)を決定します。例えば

TERM=xterm
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  1b 5b 37 6d 68 65 6c 6c  6f 2c 20 77 6f 72 6c 64  |.[7mhello, world|
00000010  0a 1b 5b 32 37 6d                                 |..[27m|

TERM=dumb
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  68 65 6c 6c 6f 2c 20 77  6f 72 6c 64 0a           |hello, world.|

興味深い機能のペアは以下にあります。man 5 terminfo、そのいくつかは次のとおりです。

  • ハイライト:smsormso
  • 下線:smulrmul
  • ウィンク(はい!):blink
  • 二重幅:swidmrwidm
  • キャンセル:rev
  • すべてキャンセルしてください。sgr0

太字のテキストを書きたいのですが、端末がそれを理解している場合にのみ、次のコードスニペットが機能します。

boldOn=$(tput smso)
boldOff=$(tput rmso)
# ...
printf "%s%s%s\n" "$boldOn" 'This message will be in bold, when available' "$boldOff"

答え2

実際、DEC端末(およびxtermを含む対応するクローンとエミュレーション)が何をしているのかを尋ねることができます。これは、個々のエスケープシーケンスのサポート(またはその完全性)とは何の関係もありません。 UNIXは通常、この機能を使用せず、代わりにtermcap / terminfoデータベースに依存しています(これらの欠点も文書化されています)。

参考までに、シーケンスはDA(「Device Attribute」、ANSI標準)およびDECID(「識別端末」、DEC private)です。

関連情報