如何 运行 另一个程序并将其输出到终端的特定部分

How to run another program and have it output to only a specific part of the terminal

我正在开发一个工具来在多个用户之间共享终端会话。

因此我的工具启动一个 pty,启动一个 shell 并将其 i/o 映射到 PTY。
stdin/stdout 然后也映射到 pty。

在启动和终端 window 调整大小时,PTY 将获得具有新大小的 TIOCGWINSZ 系统调用。

现在我想保留终端上的最后一行,以便在那里呈现 ui/statusbar。
将 TIOCGWINSZ 调用中的行数减少 1 似乎是半工作。

出于演示目的,我将 TIOCGWINSZ 中的大小设置为始终为 80x23
现在,当 运行 bash 它实际上并不像我希望的那样被 23 行限制。
当 运行 vim 时,vim 本身符合大小 - 这很好。
但是退出vim后,bash现在限制为80x23?

只要终端没有调整大小它就可以工作,之后 bash 再次使用完整的终端大小。

参见:https://asciinema.org/a/IXz2e0ni2ASPQcYpvcze8TePK

vim 在那里做什么来限制 "terminal size"?某种神奇的转义序列?
并且由于这可能是一个 hack - 正确的解决方案是什么,特别是如果我不仅要在末尾有一个备用行,而且要让整个输出以特定大小的特定偏移量呈现,例如喜欢 tmux 窗格?

其实,没关系。

通过实际使用一些晦涩的 ansi escpae 代码 (DECSTBM) 解决了这个问题,例如:echo -en '\033[0;23r'