私は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
、そのいくつかは次のとおりです。
- ハイライト:
smso
とrmso
- 下線:
smul
とrmul
- ウィンク(はい!):
blink
- 二重幅:
swidm
とrwidm
- キャンセル:
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)です。