我试图找到一种调用交互式命令行程序的方法,以便它直接从键盘和命名管道获取输入。我的目标是让它与 MATLAB 一起工作,但我认为 Bash 和一个例子一样好用。所以这个想法是启动 Bash,一旦它运行,我就可以输入命令,使用向上箭头查看历史记录等,还可以将命令发送到命名管道。几天来我一直在四处寻找和摆弄这个,但到目前为止我所尝试的一切都没有奏效。
例如,在https://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linux有一个有用的线程建议做类似的事情这:
mkfifo alt_in
(tail -f alt_in & cat) | bash
这几乎正是我正在寻找的,除了如果您尝试使用退格键或箭头键,它就无法正常工作。(我想这是因为cat
拦截击键,这通常由 bash 中的 readline 库处理?)还有其他建议吗?
最终我想有一种方法来启动一个 MATLAB 进程,这样我就可以从 TextMate 向它发送命令,但也可以在终端中与它进行交互。我在工作中使用 MATLAB,但不太喜欢它的 GUI 或编辑器。
编辑 2010 年 12 月 19 日
感谢所有非常有用的建议!我想为任何感兴趣的人总结一下这个结果。我调查了rlwrap
,但由于我的目标是让它在任何人都可以使用的 TextMate 包中工作,所以我对依赖非标准实用程序(我应该首先提到的)犹豫不决。expect
我也简单地检查了unbuffer
一下,但是,好吧,它们看起来很复杂,我只是没有勇气去深入研究。
screen
为此工作得很好 - 如下所示,我可以打开终端,开始screen
,开始matlab -nodesktop
,然后可以让 TextMate,例如,使用screen -X ...
TextMate 命令将选定的文本发送到 Matlab。我注意到这种方法的缺点是:
- 发送超过 1,024 个字符的文本块会导致“屏幕”出错;我认为某处有一些缓冲区不能容纳更多,但没有花任何时间试图追踪它。
- 屏幕有自己的回滚缓冲区,使终端的滚动条毫无用处。也许有一个选项可以改变它的工作方式?
- Control-A 是 `screen` 的命令键击;除非您重新绑定命令键,否则您不能使用它移动到行首。
当我在玩 . 时screen
,我突然想到,虽然我问的问题是关于连接管道和 STDIN 等等,但实际上我只关心一个非常具体的情况:从 TextMate 获取文本到终端。这促使我尝试使用 AppleScript 执行此操作,令人惊讶的是,结果证明它比我尝试过的任何其他事情都更简单、更健壮。创建一个 TextMate 命令,将选定的文本或当前行作为输入,并包含
#!/usr/bin/env osascript
set input_command to do shell script "cat"
tell application "Terminal"
do script input_command in window 1
end tell
只要 MATLAB 在最前面的终端窗口中,效果就很好。(也可以搜索运行 MATLAB 的终端选项卡,为了清楚起见,我只是将其排除在外。)
这个故事的寓意是我应该问更具体的问题。再次感谢所有帮助;我从摔跤中学到了很多东西!