私が考えることができる唯一の方法は、C1 リクエストを使用して戻り値をテストすることです。
$ echo `echo -en "\x9bc"`
^[[?1;2c
$ echo `echo -e "\x9b5n"`
^[[0n
$ echo `echo -e "\x9b6n"`
^[[39;1R
$ echo `echo -e "\x9b0x" `
^[[2;1;1;112;112;1;0x
上記のものは次のとおりです。
CSI c Primary DA; request Device Attributes
CSI 5 n DSR; Device Status Report
CSI 6 n CPR; Cursor Position Report
CSI 0 x DECREQTPARM; Request Terminal Parameters
ESR が管理する terminfo/termcap (リンク) には、ユーザー文字列 7 と 9 (user7/u7、user9/u9) にこれらの要求がいくつかあります。
# ユーザー機能の解釈
#
# System V Release 4 および XPG4 terminfo フォーマットは、10 個の文字列を定義します
# アプリケーションが使用する機能 .... このファイルでは、
# カバーされていない機能を記述するこれらの機能の特定
#terminfoによる。マッピングは次のとおりです。
#
# u9 端末問い合わせ文字列 (ANSI/ECMA-48 DA 相当)
# u8端末のアンサーバックの説明
# u7 カーソル位置リクエスト (VT100/ANSI/ECMA-48 DSR 6 相当)
# u6 カーソル位置レポート (ANSI/ECMA-48 CPR と同等)
#
# 端末の照会文字列は、アンサーバック応答を引き出す必要があります
# ターミナルから。の一般的な値は ^E になります (古い ASCII では
# 端末) または \E[c (新しい VT100/ANSI/ECMA-48 互換端末の場合)。
#
# カーソル位置リクエスト () 文字列は、カーソル位置を引き出す必要があります
# 報告。典型的な値 (VT100 端末の場合) は \E[6n です。
#
# 端末のアンサーバックの説明 (u8) は、予想される
# 回答文字列。文字列には次の scanf(3) のようなものが含まれる場合があります
# エスケープ:
#
# %c 任意の文字を受け入れる
# %[...] 指定されたセット内の任意の数の文字を受け入れます
#
# カーソル位置レポート () 文字列には、2 つの scanf(3) スタイルが含まれている必要があります
# %d フォーマット要素。これらの最初のものは Y 座標に対応する必要があります
# と %d の 2 番目。文字列にシーケンス %i が含まれている場合、それは
# 読み取り後に各値をデクリメントする命令と見なされます (これは
# カップ ストリングからの逆の意味)。典型的な CPR 値は
# \E[%i%d;%dR (VT100/ANSI/ECMA-48 互換端末)。
#
# これらの機能は、terminfo アクション チェッカーである tac(1m) によって使用されます。
# (ncurses 5.0 で配布)。
例:
$ echo `tput u7`
^[[39;1R
$ echo `tput u9`
^[[?1;2c
もちろん、表示の破損だけを防ぎたい場合は、less
アプローチを使用して、制御文字の表示/非表示をユーザーに切り替えさせることができます ( の -r および -R オプションless
)。また、出力文字セットがわかっている場合、ISO-8859 文字セットには制御コード用に予約された C1 範囲があります (したがって、その範囲には印刷可能な文字がありません)。