0

tputと端末サイズの相互作用について少し混乱しています。の動作はtput、それが呼び出されるシェルに依存しているようです。または、シェルが端末設定の変更を担当している可能性があります。問題を軽減するには、次のことを考慮してください。

dash$ exec bash
bash$ trap 'echo winched' WINCH
bash$ tput cols
176
bash$ # changing terminal size now (after hitting return)
bash$ winched
bash$ winched
tput cols
150
bash$ exec dash
dash$ trap 'echo winched' WINCH
dash$ tput cols
150
dash$ # changing terminal size now (after hitting return)
dash$ tput cols
winched
150

ここで、bash では、物事は (ほぼ) 期待どおりに動作し (WINCH ハンドラーが 2 回実行される理由がよくわからないため、ほとんどと言います)、出力はtput新しい端末サイズに一致するように変更されます。ただし、ダッシュで実行するとtput、端末のサイズが変わっても出力は変わりません。また、WINCH ハンドラーはダッシュによって遅延しているように見え、次のコマンドが入力されるまで (ただし、実行される前に) 実行されないことに注意してください。ここで何が起こるはずですか?tputシェルが何をしているか気にしますか?ウインチは関係ありますか?質問は次のとおりだと思います。

tput端末のサイズはどのようにわかりますか?

また、出力をあまり混乱させたくありませんでしたが、例の各シェルでは TERM が設定され、infocmp $TERM有効と思われる te​​rminfo の説明が出力されます。(出力が得られるという事実は、それが有効なデータであることを示していると思います!)

4

1 に答える 1

1

説明からは明らかではありません:

-Ttype
は、端末のタイプを示します。デフォルトは環境変数から取得されるため、通常、このオプションは不要ですTERM。が指定されている場合-T、シェル変数 LINES およびCOLUMNSも無視されます。

ただし、現在の tput呼び出しuse_envとオプションuse_tioctlの場合:-T

20171007
    + modify "-T" option of clear and tput to call use_tioctl() to obtain
      the operating system's notion of the screensize if possible.

tputマニュアルページには、より詳細なセクションTerminal Size があります

この例 (ncurses 6.1 を使用) は期待どおりに動作します。

#!/bin/bash

trap "resize; tput cols; tput -T$TERM cols" WINCH

while true
do
        sleep 1
done

ncurses 6.0 では、その違いがわかります。他の実装では、ymmv .

bashに関しては、しばらく前に議論されました: tput cols はスクリプトで適切に機能しません-T(ただし、その q/a はオプションとは関係ありません)。

于 2020-04-21T19:41:09.793 に答える