tput samのようなエスケープシーケンスで設定された終了ステータスを問い合わせる方法は?

tput samのようなエスケープシーケンスで設定された終了ステータスを問い合わせる方法は?

QEMUは私の端末を変な状態にしておきました。tput smamついに問題の正確な関数であるvsまでデバッグするのに時間がかかりましたtput rmam

現在の端末状態を確認し、すべての機能の現在値を一度に表示する方法はありますか?

これにより、動作中の端末と「壊れた」端末を簡単に区別して、何が修正されたかを把握できます。

smamしかし対。対。などの特定の機能の現在の状態を把握するのも良いスタートrmamです。

Ubuntu 19.10、Gnome端末でテストされました。

答え1

これは機能します(VTEはこの制御の一部を実装します)。

CSI ? PS $ p

DECプライベートモード(DECRQM)を要求します。 VT300以上の場合、DECRPMに対する応答は次のとおりです。

犯罪現場調査?PS;午後$y

ここで、PsはDECSET / DECSETのモード番号、PmはANSI DECRQMのモード値です。

具体的には、PS7である:

       Ps = 7  ⇒  Auto-wrap Mode (DECAWM), VT100.

これは、以下で使用される設定に対応します。端末の説明:

rmam=\E[?7l, smam=\E[?7h,

だから...あなたはします

printf '\033[?7$p'

そして戻ってくるのを楽しみにしています。

\033[?7;1$y

または

\033[?7;2$y

モードが設定されているかリセットされているかによって異なります。

これはまた、スクリプト/プログラムが読んでいると仮定します。端末(不要標準入力)。いくつかあります。テスト/デモスクリプトxtermのリソースに役立つ資料を見つけることができます(ほとんどのリソースはVTEには適用されません)。通常、私はこの機能をテストします。テスト、使用するすべてのシステムに合わせてパッケージ化されています。

答え2

到着再充填する Thomas Dickieの便利な答え、POSIX規格に準拠するために必要なすべての重要な情報を提供します。便利機能 tmode、便利なコマンドで修正されましたモスビー次のコメント:

端末モード番号が与えられたら、モードの状態を反映するために'SET'orを印刷します。'RESET'

# Get status of the DECAWM (autowrap) mode
$ tmode 7
RESET

指示:

誰でもこれについてより多くの情報を得ることができる場合は、コメントを残してください。

  • 機能以下にのみ適用されます。確認する端末エミュレータ、特にいいえGNOME端末から:

    • macOS:、iTerm2.appしかし組み込まれていないTerminal.app
    • Ubuntu:XTermUXTerm、標準GnomeではないTerminal
    • Windows(WSL):いいえ以前のコンソールウィンドウまたはWindows端末ではサポートされていません。
  • 再支援モード番号:

    • これconsole_codes(4) Linuxmanページ一部「DEC特殊モード(DECSET/DECRST)シーケンス」1、3、5..9、25、1000のみが記載されています。

    • 存在する実践、上記の端末エミュレーションは、次の意味のある値を返します。

      • iTerm2.appmacOS:1..3、5..8、25、40..41、45、47、69、1000
      • [U]XTermUbuntu:1..7、9、12、18..19、25、30、35、38、40..42、44..45、47、66..67、69、80、95、1000
    • まだ残っていて、数字ではないモデルリンクされたページで言及されていmanます(例:()と=()) - クエリする方法がわかりません。DECPAM>DECPNM

    • しかし、トーマスディッキーリンクDECプライベートモードエスケープシーケンスの説明では、戻り値が0不明なモードおよび3/4または「永久設定/リセット」を示すことに言及しています。実際、これは4未知のモード、既知のモードのみを報告します1(「設定」、つまりオン)、または2(「リセット」、つまり終了)。

シェル機能tmode:

#! /bin/sh -

tmode() (

  [ "$#" -eq 1 ] || { echo "Usage: tmode <mode-number>" >&2; return 2; }
  modeNum="$1"

  # Redirect stdin and stdout temporarily to the controlling terminal.
  # This is necessary so that invocation such as `result=$(tmode 1)` work.
  {
    stty_settings="$(stty -g)"
    stty -icanon -echo min 0 time 5
    # Query the terminal.
    printf '\33[?%s$p' "$modeNum"
    result=$(dd count=1)
    stty "$stty_settings"
  } <> /dev/tty >&0 2> /dev/null
  
  # Activate this to visiualize the raw result.
  # printf %s "$result" | od -t x1 -t c > /dev/tty

  # Print a friendly result.
  case $result in
    *';1$'*)
     echo SET;;
    *';2$'*)
     echo RESET;; 
    # NOTE: It seems that 4 is only ever used to signal a nonexistent mode.
    # *';3$'*)
    #  echo PERMANENTLY SET;; 
    # *';4$'*)
    #  echo PERMANENTLY RESET;; 
    *)
      echo "Unknown mode: $modeNum" >&2;;
  esac
)

答え3

設定モード

ESC [Ⓝh
ESC [?

モードリセット // 設定解除

ESC [ Ⓝ l
ESC [ ?

リクエストモード//クエリステータス

ESC [ Ⓝ $p
ESC [ ?

Ⓝは10進数(モード)です。

シェルでテスト

#set
echo -ne '\e[?1049h'

#query = set
echo -ne '\e[?1049$p'; cat
^[[?1049;1$y

#reset
echo -ne '\e[?1049l'

#query = not set
echo -ne '\e[?1049$p'; cat
^[[?1049;2$y

参考資料

xterm ドキュメント: DECRQM DECRQM
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#:~:text=DECRQM
注:Chromeアクセスを使用すると、スクロールしてウェブページのキーワードを強調表示できます。


制御シーケンス
https://terminalguide.namepad.de/seq/

パターンリスト
https://terminalguide.namepad.de/mode/

設定モード
https://terminalguide.namepad.de/seq/csi_sh/
https://terminalguide.namepad.de/seq/csi_sh__p/

リクエスト方法
https://terminalguide.namepad.de/seq/csi_sp_t_dollar/
https://terminalguide.namepad.de/seq/csi_sp__p_t_dollar/


vt100 ドキュメント
https://vt100.net/docs/vt510-rm/DECRQM.html
https://vt100.net/docs/vt510-rm/DECRPM.html
https://vt100.net/docs/vt220-rm/chapter4.html#S4.6

関連情報