シリアルコンソールウィンドウのサイズを変更できますか?

シリアルコンソールウィンドウのサイズを変更できますか?

私のシステムのシリアルコンソールを使用しているときはいつで$COLUMNS=80もとで終わります$LINES=24

これらの変数は手動で変更できますが、クライアント端末ウィンドウのサイズ変更中にいつでもこれを行うのは少し面倒です。

通常、私はコンソールに接続を使用しますscreen /dev/mytty baudrate

$TERM環境変数を「screen」または「xterm」に変更しても役に立ちません。

getty通話にvt100の代わりにこれらのいくつかを使用する必要がありますか?

言うまでもなく、SSHを使用して同じシステムに接続すると、これらすべてがうまく機能します。

答え1

前の解説者が述べたように、各コマンドの後に呼び出す以外に選択肢はありません。resizeこのコマンドがなくxterm()にパッケージをインストールしたくない場合は、同じタスクを実行する2つのPOSIXシェルスクリプトがあります。 ANSI端末エスケープコードを使用してください。

res() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\0337\033[r\033[999;999H\033[6n\0338' > /dev/tty
  IFS='[;R' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

res2() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '\033[18t' > /dev/tty
  IFS=';t' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

ちなみに、私の.profileファイルには次のものがあります [ $(tty) = /dev/ttyS0 ] && res 。たとえば、デバイスを再起動した後、シリアル回線(管理に使用する回線)を介してログインするたびに端末のサイズを決定します。
次のアイデアもご覧ください。鋸歯状各コマンドの後にサイズ変更を実行するには、コメントにこの行を追加します[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG(私が知っている限り、これは常に可能ではないか、常に可能ではないことに注意してくださいbusybox)。

答え2

記録のために、その質問に対する答えは次のとおりです(Usenetが勝ちました)。

仮想端末アプリケーション(および他のアプリケーション)内で実行されているコンソールアプリケーションは、サイズ変更操作がxterm発生した後にそれを受け取りますrxvtSIGWINCHしたがって、アプリケーションは、対応する信号ハンドラからウィンドウなどを再描画することができる。

残念ながら、シリアルコンソールを使用する場合、そのようなメカニズムはありません。

ただし、アプリケーションは積極的に要求できます。現在のコンソールウィンドウのサイズ。したがって、2番目に良い方法は、シェルがコマンドプロンプトを印刷するたびにこれを行うことです。

これは最初に達成できます。特別にサイズ変更された実行可能ファイルのコンパイル次に、次を使用しますbashrc

if [ $(tty) == '/dev/ttyS0' ]; then
  trap resize DEBUG
fi

もちろん、実行時にコンソールアプリケーションのコンソールサイズ設定は変更されません。

答え3

「サイズ調整可能」端末自体はNAWS(Negotiate About Window Size~からRFC 1073 Telnetウィンドウサイズオプション)。

シリアルポートを使用してコンピュータに直接接続する場合、ネゴシエーションは必要なく、コンピュータは端末の画面サイズを直接知ることはできません。

端末がサイズをネゴシエートできる場合、コンピュータはSIGWINCH端末で実行されているアプリケーションに画面サイズの概念を更新するように求めます。

コンピュータが画面サイズを知らない場合は、通常stty -a表示サイズ(行と列)をゼロに設定します。これはインタラクティブな使用には少し非友好的であり、一部のシステムは環境変数を使用してLINES役立ちCOLUMNSます。割り当てられた値可能通常、端末記述から派生し、単にハードコードされます。これらの変数の契約では、明示的に抑制されない限り適用する必要があります(たとえば、呪いアプリケーションなど)。use_env機能。肯定的な面では、信頼できる情報がない場合にこれらの変数が役に立ちます。欠点は、これらの変数を変更する便利な方法がないことです。

これresizeプログラム(ユーティリティ提供:xterm)VT100スタイルカーソル位置のレポートエスケープシーケンスを使用して画面サイズを決定できます。これはコマンドラインから実行できます。 (やはり)これを自動化する便利な方法はありません。副作用としてマークさresizeれた行/列に関する情報が更新されますstty。主に、このような状況に対して更新された環境変数を提供するために使用されますLINESCOLUMNS はい設定を更新する必要があります。

答え4

これはbashにのみ適用されるシンプルで迅速なサイズ変更機能です。read -d delim読み取りタイムアウトを防ぐためにbashを使用してphkのres2で修正されました。

resize() {
  old=$(stty -g)
  stty -echo
  printf '\033[18t'
  IFS=';' read -d t _ rows cols _
  stty "$old"
  stty cols "$cols" rows "$rows"
}

関連情報