当使用我的系统的串行控制台时,我总是以$COLUMNS=80
和结束$LINES=24
。
虽然我可以手动更改这些变量,但在调整客户端终端窗口大小时随时执行此操作有点烦人。
通常我使用 连接到控制台screen /dev/mytty baudrate
。
将$TERM
环境变量更改为“screen”或“xterm”没有帮助。
我需要getty
使用其中一些来代替 vt100 进行呼叫吗?
不用说,当我使用 ssh 连接到同一台机器时,所有这些都工作正常。
答案1
就像我之前的评论员提到的,除了在每个命令之后调用之外别无选择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"
}
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
以便每次通过串行线路(我用于管理的线路)登录时确定终端大小,例如在重新启动设备后。
另请参阅以下想法锯齿形在注释中添加该行,[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG
以便在每个命令之后运行调整大小(请注意,据我所知,它并不或并不总是可能的busybox
)。
答案2
仅供记录,以下是该问题的答案(Usenet 获胜):
在虚拟终端应用程序(以及其他应用程序)内运行的控制台应用程序xterm
将在发生调整大小操作后rxvt
收到。SIGWINCH
因此,应用程序将能够在相应的信号处理程序中重绘窗口等。
不幸的是,当使用串行控制台时,没有这样的机制。
然而,应用程序可以主动请求当前的控制台窗口大小。因此,第二好的做法是每次 shell 打印命令提示符时都执行此操作。
这可以通过首先实现编译特殊的调整大小可执行文件然后在中使用以下内容bashrc
:
if [ $(tty) == '/dev/ttyS0' ]; then
trap resize DEBUG
fi
当然,这不会在运行时更改控制台应用程序中的控制台大小设置。
答案3
“可调整大小”终端本身是 NAWS 的结果(Negotiate About Window Size
从RFC 1073 Telnet 窗口大小选项)。
如果您使用串行端口直接连接到计算机,则不涉及任何协商,并且计算机无法直接了解您的终端的屏幕尺寸。
如果终端可以协商尺寸,计算机将向SIGWINCH
终端中运行的应用程序发送消息,告诉它们更新屏幕尺寸的概念。
当计算机不知道屏幕尺寸时,它通常将stty -a
(行和列)显示的尺寸设置为零。对于交互使用来说,这有点不友好,有些系统使用环境变量LINES
和COLUMNS
来提供帮助。分配的值可能源自终端描述;更常见的是,它们只是被硬编码。这些变量的约定要求它们生效,除非明确抑制,例如,在curses应用程序中use_env
功能。从积极的一面来看,当没有可靠的信息可用时,这些变量可能很有用。不利的一面是,没有方便的方法来改变这些变量。
这resize
程序(提供的实用程序xterm
)可以使用VT100风格的光标位置报告转义序列来确定屏幕尺寸。这可以从命令行运行; (再次)没有方便的方法来自动执行此操作。作为副作用,resize
更新 所看到的行/列的信息stty
。它用于提供更新的环境变量主要适用于诸如此类的情况,其中LINES
和COLUMNS
是设置,并且应该更新。
答案4
这是简单快速的调整大小功能,仅适用于 bash。它是从 phk 的 res2 修改而来的,利用 bash 来read -d delim
避免超时读完。
resize() {
old=$(stty -g)
stty -echo
printf '\033[18t'
IFS=';' read -d t _ rows cols _
stty "$old"
stty cols "$cols" rows "$rows"
}