使用我系统的串行控制台时,我总是以$COLUMNS=80
和结束$LINES=24
。
虽然我可以手动更改这些变量,但在调整客户端终端窗口大小时随时执行此操作会有些烦人。
通常我使用screen /dev/mytty baudrate
.
将$TERM
环境变量更改为“screen”或“xterm”没有帮助。
我需要getty
用其中一些而不是 vt100打电话吗?
不用说,当我使用 ssh 连接到同一台机器时,所有这些都可以正常工作。
phk*_*phk 39
就像我之前的评论员提到的,除了resize
在每个命令之后调用之外别无选择,如果你没有这个命令并且你不想安装它在 ( xterm
) 中的包,这里有两个 POSIX shell 脚本,它们做同样的事情使用 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"
}
Run Code Online (Sandbox Code Playgroud)
res
基于https://wiki.archlinux.org/index.php/working_with_the_serial_console#Resizing_a_terminal 中提供的解决方案。它的工作原理如下:
res2
受resize.sh
xterm 的影响(参见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
以便在每次通过串行线路(我用于管理的线路)登录时确定终端大小,例如在您重新启动设备之后。
另请参阅rsaw在评论中使用该行的想法,[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG
以便在每个命令之后运行调整大小(请注意,AFAIK 并非或并不总是可能启用busybox
)。
Sve*_*gus 18
只是为了记录,这里是这个问题的答案(Usenet 赢了):
控制台应用程序在虚拟终端应用程序(xterm
,rxvt
和朋友)中运行,将SIGWINCH
在调整大小操作发生后接收。因此,应用程序将能够在相应的信号处理程序中重绘窗口等。
不幸的是,当使用串行控制台时,没有这样的机制。
然而,应用程序可以主动询问当前的控制台窗口大小。因此,第二好的做法是每次 shell 打印命令提示符时都执行此操作。
这可以通过首先编译一个特殊的调整大小的可执行文件,然后在 中使用以下内容来实现bashrc
:
if [ $(tty) == '/dev/ttyS0' ]; then
trap resize DEBUG
fi
Run Code Online (Sandbox Code Playgroud)
当然,这不会在运行时更改控制台应用程序中的控制台大小设置。
Tho*_*key 11
“可调整大小”终端是 NAWS(Negotiate About Window Size
来自RFC 1073 Telnet Window Size Option)的结果。
如果您使用串行端口直接连接到计算机,则不涉及协商,计算机也无法直接了解终端的屏幕大小。
如果终端可以协商大小,计算机将发送SIGWINCH
到终端中运行的应用程序,告诉他们更新他们对屏幕大小的概念。
当计算机不知道屏幕大小时,它通常会将stty -a
(行和列)显示的大小设置为零。对于交互使用,这有点不友好,有些系统使用环境变量LINES
和COLUMNS
帮助。分配的值可能来自终端描述;更常见的是,它们只是硬编码。这些变量的约定要求它们生效,除非明确禁止,例如,在curses 应用程序use_env
函数中。从积极的方面来说,当没有可靠的信息可用时,这些变量会很有用。不利的一面是,没有方便的方法来改变这些变量。
该resize
程序(随 提供的实用程序xterm
)可以使用 VT100 样式的光标位置报告转义序列来确定屏幕大小。这可以从命令行运行;(再次)没有方便的方法来自动执行此操作。作为副作用,resize
更新stty
. 它提供更新的环境变量的用途是这样的情况下,其中主要是有用的LINES
和COLUMNS
被设定的,应该进行更新。