私のシステムのシリアルコンソールを使用しているときはいつで$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"
}
res
提案されたソリューションに基づいてhttps://wiki.archlinux.org/index.php/working_with_the_serial_console#Resizing_a_terminal。仕組みは次のとおりです。res2
xtermの影響を受けますresize.sh
(参照https://github.com/ThomasDickey/xterm-snapshots/blob/master/vttests/resize.sh)。これはxterm
私たちが望む情報を得るために特定のコードを使用します(多くの端末エミュレータで実装されています)。以下を参照してください。http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Functions-using-CSI-_-ordered-by-the-final-character_s_(「テキスト領域のサイズを文字単位で報告します。」)。
ちなみに、私の.profile
ファイルには次のものがあります
[ $(tty) = /dev/ttyS0 ] && res
。たとえば、デバイスを再起動した後、シリアル回線(管理に使用する回線)を介してログインするたびに端末のサイズを決定します。
次のアイデアもご覧ください。鋸歯状各コマンドの後にサイズ変更を実行するには、コメントにこの行を追加します[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG
(私が知っている限り、これは常に可能ではないか、常に可能ではないことに注意してくださいbusybox
)。
答え2
記録のために、その質問に対する答えは次のとおりです(Usenetが勝ちました)。
仮想端末アプリケーション(および他のアプリケーション)内で実行されているコンソールアプリケーションは、サイズ変更操作がxterm
発生した後にそれを受け取りますrxvt
。SIGWINCH
したがって、アプリケーションは、対応する信号ハンドラからウィンドウなどを再描画することができる。
残念ながら、シリアルコンソールを使用する場合、そのようなメカニズムはありません。
ただし、アプリケーションは積極的に要求できます。現在のコンソールウィンドウのサイズ。したがって、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
。主に、このような状況に対して更新された環境変数を提供するために使用されますLINES
。COLUMNS
はい設定を更新する必要があります。
答え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"
}