控制具有抽象层的交互式终端程序

时间:2018-05-11 22:09:44

标签: bash process io io-redirection fifo

我希望在一个终端中运行一个分页命令(通常是一个git diff,但可能只是我的一些其他程序用管道传输到less),这是一个完全交互式的,但它可以从外部控制。最初只是能够终止并重新启动内部进程会很好,但是能够以交互方式注入输入会很不错。

我认为这样做的一种简单方法可能是使用一个只运行内部命令的bash脚本,假设它是git diff

我将以这样的方式编写我的文本编辑器vim的脚本,当我保存文件时,它将“发送一个信号”,表明前面提到的bash脚本已经以某种方式注册了。在这个事件中,它将中断交互式子less进程(例如,给它一个SIGTERM似乎有点工作,虽然它无法重绘)并再次运行它。这样我就可以通过保存文件来实时更新我的​​git diff。

我的其他用例可以使用相同的框架:我希望我的光标在我的编辑器中悬停的标记用于搜索项目,以查找它的所有其他实例。例如,触发器与保存缓冲区不同,也更频繁。

应保持交互性的原因(例如终端连接到STDIN)是因为我可以使用鼠标/键在交互式内部在寻呼机内上下滚动。

实现这一目标的一种直截了当且看似脆弱的方法是将vim配置为直接将SIGTERM提供给较少的SIGTERM或将SIGKILL直接提供给父git diff(仅从经验测试中可以看出这对我的Mac有效) )。

但是我想要如何杀死内部交互式进程以生存在shell脚本中的逻辑和实现。

我在想我可以使用fifo并发送一些shell脚本解释的协议消息。但似乎发生的事情是终端交互式标准输入是通过shell脚本传递的...我可能需要某种守护进程或由它管理的东西。需要有另一个组件来监听事件。

这让我想知道:也许这意味着更实际和更简单的实现方法是使用node.js这样的运行时可以给我异步控制或其他i / o多路复用或异步i / o方法。它保持闲置状态,并将stdin(交互)管道/转发给孩子。它还与fifo或其他IPC方法异步侦听,并将对从它接收的命令进行操作,例如,注入进一步的交互式输入或杀死/重启孩子...

似乎应该有规范的基础来实现这一点,虽然我觉得我可能还记得如何使用较低级别的操作系统API如select(我传统上记得从我的学习中记忆为i / o)多路复用),像这样的多路复用可能超出了shell的范围,shell在i / o 重定向周围有很多糖和能力。

1 个答案:

答案 0 :(得分:0)

关注我的问题。

我一直走这条路,并探索了一些选择。我或多或少正在构建一个node.js应用程序,该应用程序使用显式定义的(且已检查非terminfo的)终端转义代码来实现我自己的寻呼机工具,该工具可以完全执行我想要的操作,而且没有更多也不少。 / p>

我还一直在围绕通过tmux引入的此功能构建自动化测试基础结构(例如,使用其capture-pane命令)。例如,要测试分页是否正常,我可以在打开缓冲区后检查,向下滚动3页并备份2页后,其输出与在1页之后显示的输出相同。

尽管可以说它可能应该只是一个简单的ncurses应用程序,但是我发现它是一种有益的经验,可以深入研究这些东西并继续使用打字稿,我已经为其他任务写了很多文章,并有助于继续积累使用该语言的经验。当然,对于这种专用工具不是理想的语言或运行时,但这没关系。