我有一个 REPL(读取评估打印循环)克洛尤尔侦听网络套接字的编程语言。我可以通过网络向其发送代码,代码将被评估并将答案发送回给我。我正在使用该netcat
实用程序发送代码
# send the contents of code.txt to port 5678 on somemachine
$ netcat somemachine 5678 <code.txt
我的问题是我不想使用环形此 REPL 的功能。就我而言,我想发出一个一次性命令,接收并在标准输出上显示答案,然后退出我的命令(远程计算机上的 REPL 应该保持运行)。下面的示例有效,但netcat
不退出并且我无限期地保持与 REPL 的连接。
$ cat code.txt
(doseq [x (range 0 10)] (println (* x x)))
$ netcat somemachine 5678 <code.txt
user=> 0
1
4
9
16
25
36
49
64
81
nil
user=>
我们可以看到 REPL 的提示符(“user=>”)显示了两次:一次在代码评估之前,一次在评估之后。似乎获得我想要的东西的关键是将某些东西链接到我的命令末尾,该命令会监视并等待,直到提示符再次显示然后终止netcat
。
在 bash 终端中手动运行此命令时,我可以在看到第二个提示后按 Ctrl-C,但这样做的目的是在 TextMate 编辑器的扩展中使用。
有任何想法吗?
答案1
我认为其他两个答案可能更适合您的具体情况,但要回答您的一般问题,您可以在最后加上这一点:
netcat somemachine 5678 <code.txt |
while read ln;do
[ "${ln#user=>}" != "$ln" -a "$gotone" = true ] && exit
[ "${ln#user=>}" != "$ln" ] && gotone=true
echo "$ln"
done