可调整大小的串行控制台窗口?

Sve*_*gus 40 serial-console

使用我系统的串行控制台时,我总是以$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)

顺便说一句,在我的.profile文件中,您会发现以下内容: [ $(tty) = /dev/ttyS0 ] && res 以便在每次通过串行线路(我用于管理的线路)登录时确定终端大小,例如在您重新启动设备之后。
另请参阅rsaw在评论中使用该行的想法,[ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG以便在每个命令之后运行调整大小(请注意,AFAIK 并非或并不总是可能启用busybox)。

  • PS:为了更持久,将 `[[ $(tty) == /dev/ttyS0 ]] &amp;&amp; trap res2 DEBUG` 添加到 shell 配置文件之一(例如,`/etc/profile`,`~/.bash_profile `)。这将使它在每个命令之后运行(如果您使用 screen/tmux/terminal-emulator 调整窗口/窗格的大小,这只会是一件好事)。 (3认同)
  • @phk xterm 的 `resize` 速度更快——通常为 0.002 秒。 (3认同)
  • 使用它几分钟后,我很快意识到 `res` 和 `res2` 都太慢了,除了在首次登录时使用。在我的机器上,它们都需要 0.5 秒才能完成……使我的所有命令看起来都很缓慢(与 DEBUG 陷阱一起使用时)。哎呀!不能有那个。猜猜我会安装`xterm`。 (2认同)

Sve*_*gus 18

只是为了记录,这里是这个问题的答案(Usenet 赢了):

控制台应用程序在虚拟终端应用程序(xtermrxvt和朋友)中运行,将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(行和列)显示的大小设置为零。对于交互使用,这有点不友好,有些系统使用环境变量LINESCOLUMNS帮助。分配的值可能来自终端描述;更常见的是,它们只是硬编码。这些变量的约定要求它们生效,除非明确禁止,例如,在curses 应用程序use_env函数中。从积极的方面来说,当没有可靠的信息可用时,这些变量会很有用。不利的一面是,没有方便的方法来改变这些变量。

resize程序(随 提供的实用程序xterm)可以使用 VT100 样式的光标位置报告转义序列来确定屏幕大小。这可以从命令行运行;(再次)没有方便的方法来自动执行此操作。作为副作用,resize更新stty. 它提供更新的环境变量的用途是这样的情况下,其中主要是有用的LINESCOLUMNS 设定的,应该进行更新。