Answers:
就像我前面提到的注释程序一样,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
这样,在每次通过串行线路登录时(我用于管理的登录),例如在重启设备后,就可以确定终端的大小。
另请参见rsaw在注释中的想法,使该行[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG
出现在该行中,以便在每个命令后都执行调整大小操作(请注意,busybox
虽然AFAIK并非总是如此,但并非总是如此)。
res
&res2
太慢任何东西,但使用在第一次登录。在我的机器上,它们都需要0.5秒才能完成...使我的所有命令显得缓慢(当与DEBUG陷阱一起使用时)。哎呀!不能那样 猜猜我要安装xterm
。
resize
速度更快-通常为0.002秒。
busybox
对我来说似乎同样缓慢。
resize
不是一种选择。
仅作记录,这是此问题的答案(Usenet赢了):
在调整大小操作之后xterm
,rxvt
将接收SIGWINCH
在虚拟终端应用程序(和)中运行的控制台应用程序。因此,应用程序将能够在相应的信号处理程序中重绘窗口等。
不幸的是,使用串行控制台时,没有这种机制。
但是,应用程序可能会主动要求当前控制台窗口的大小。因此,第二件事是每当外壳程序打印命令提示符时都执行此操作。
这可以通过首先编译一个特殊的调整大小的可执行文件,然后在以下代码中使用以下代码来实现bashrc
:
if [ $(tty) == '/dev/ttyS0' ]; then
trap resize DEBUG
fi
当然,这不会在运行时更改控制台应用程序中的控制台大小设置。
resize
您系统上安装的版本。
这样的“可调整大小”终端是NAWS的结果(Negotiate About Window Size
来自RFC 1073 Telnet窗口大小选项)。
如果您使用串行端口直接连接到计算机,则不涉及协商,并且计算机不直接了解终端的屏幕尺寸。
如果终端可以协商大小,则计算机将发送SIGWINCH
到终端中运行的应用程序,告诉他们更新其屏幕大小的概念。
当计算机不知道屏幕大小时,通常会将stty -a
(行和列)显示的大小设置为零。对于交互使用,这是一个有点不友好,和一些系统使用环境变量LINES
和COLUMNS
提供帮助。所分配的值可以从终端描述中得出。通常,它们只是硬编码。这些变量的约定要求它们生效,除非明确禁止(例如在curses应用程序中use_env
起作用)。从积极的方面来说,如果没有可靠的信息,这些变量可能会很有用。不利的一面是,没有方便的方法来更改这些变量。
该resize
程序(随附带的实用程序xterm
)可以使用VT100样式的光标位置报告转义序列来确定屏幕尺寸。可以从命令行运行。再也没有自动执行此操作的便捷方法。副作用是,resize
更新了所看到的行/列上的信息stty
。它提供更新的环境变量的用途是这样的情况下,其中主要是有用的LINES
和COLUMNS
被设定的,应该进行更新。
这是另一个对我的嵌入式Linux系统(运行Angstrom的Overo)非常有用的解决方案。我只是从我的.bashrc文件中运行了它。我不想使用调整大小,因为这需要安装一些X软件包,而我则不需要。
如果您可以改用FreeBSD,则可以使用resizewin(1)命令,它确实可以满足您的需求。
通过串行线路运行Shell会话时,resize
在该会话内调用命令就足够了-在建立连接之后以及每次更改终端几何形状之后。
该resize
命令是xterm的一部分,但不依赖于X11。例如,在Fedora上,它分别打包为xterm-resize
。
工作原理:resize命令通过一些光标移动来测量高度/宽度,然后通过转义序列将这些值发送到终端。
使用像zsh这样的shell,它也可以自动更新LINES
和COLUMNS
变量(或者,可以评估命令打印到stdout的导出语句)。
为何需要这样做:通过本地或ssh会话,终端可以向会话发出有关几何变化的信号(请参见SIGWINCH)。该机制不适用于串行连接。
[[ $(tty) == /dev/ttyS0 ]] && trap res2 DEBUG
到外壳程序配置文件配置之一(例如/etc/profile
,~/.bash_profile
)。这将使其在每个命令之后运行(仅当您使用screen / tmux / terminal-emulator调整窗口/窗格的大小时,这才是一件好事)。