我想编写一些可以在单个窗口中打开多个终端窗格的脚本,就像tmux
或 一样screen
。
我个人非常精通tmux
,并且已经使用它很多年了,但是我们团队中的其他开发人员不想了解有关它或其他屏幕多路复用器的任何信息。
为此,我想编写可以在单个窗口的多个窗格中将自己分开的脚本。这可以通过直接 bash 实现吗?
我的目标是
- 避免要求
node
或需要安装的东西,(例如祝福贡献),使过程尽可能简单。 - 使用大多数发行版上预安装的并且与 posix 兼容的东西来编写它。
- 有一个终端窗口,它被分成多个窗格,其中每个窗格可以是一个正在运行的进程或命令提示符。
- 当有人点击时,
ctrl+c
它会退出所有窗格,并返回到单个终端。
答案1
我认为可以肯定地说,这不能仅仅通过 bash 来完成。您将需要更高级的编程语言(例如 perl/python),或者使用脚本控制 tmux 实例。
以下是对所涉及技术的快速回顾:
- 为了在期望的终端环境中运行程序,您需要创建一个伪终端 (pty)来主持它。
- ptys 是使用系统调用创建和控制的,例如读写控制,并且有一个相当低级的 API。
- 要执行类似 tmux 的操作,您需要不断读取每个 pty 的控制端,然后使用特殊的方法将这些片段拼接到主程序的终端上终端转义码
- 终端功能(即终端支持的用于光标定位和粗体/颜色/下划线等的转义序列)有数百种变体,因此如果您想要任何类型的兼容性,您将需要使用类似的库恩诅咒帮助您设置子窗口。
有一些工具可以让 bash调用ioctl但我不认为它可以处理 pty 分配所需的所有调用,而且它无论如何都不是标准工具。
你也许可以通过以下方式解决这个问题手动创建pty设备节点但你需要以 root 身份运行,这会很混乱。
bash 可以从命令中找出各种终端转义序列tput
,实际上您可以编写渲染文本窗口的 bash 脚本,但如果没有 ncurses,这很难正确且跨平台地完成,并且会花费大量时间。
简而言之,我认为您无法使用普通的 bash 和 posix 工具来完成此任务。
Perl 几乎安装在所有 UNIX 上,并且 perl 可以进行ioctl
调用,所以是的,即使不安装任何额外的模块,也应该可以用 perl 编写它。然而,我再次预计,如果不至少使用一些额外的辅助模块(例如IO::Pty和诅咒。但即便如此,仍有很多工作要做。
我认为你最好的选择就是尝试脚本tmux。我以前没有这样做过,但那篇文章看起来像是一个为期几天的项目,而不是几周和大量的学习项目。
如果您的主要反对意见是必须安装 tmux,您可以尝试下载并编译 tmux 的静态二进制文件,然后将其与脚本一起分发。静态二进制文件可以避免对系统中任何库的依赖,并且应该可以在任何具有正确架构的现代 Linux 内核上运行。您甚至可以为多个体系结构编译二进制文件,然后让脚本检测要使用哪个二进制文件。