【问题标题】:Programmatically send commands to an interactive REPL from Bash?以编程方式从 Bash 向交互式 REPL 发送命令?
【发布时间】:2016-10-06 18:17:33
【问题描述】:

是否可以以编程方式输入一些 repl(例如mongo),并以编程方式与之交互?也就是说,你能不能以编程方式做到这一点:

$ mongo
MongoDB shell version: 2.4.8
connecting to: test
> db.collections
test.collections
> exit
bye

所做的只是:

  1. 使用mongo 命令登录到REPL。我知道有可能以某种方式做到这一点,我已经看到 create interactive REPL's in the Node.js world 做到了。了解如何直接在 bash 中执行此操作会很有帮助。
  2. 登录后,我输入了db.collections,只是探索了REPL。这个 SO 问题是在问,你能以编程方式执行 this 吗?就像你可以(a)从 bash 脚本创建一个子进程/REPL,然后(b)向它发送像db.collections 这样的任意消息,它会评估。 (你能得到响应/输出吗)。
  3. 以编程方式注销 REPL。

这可能吗?

【问题讨论】:

  • 使用“Here-Docs”在此处搜索 Qs(由 << EOS .... cmds ... EOS 分隔(不幸的是,EOS 可以是任意字符串,因此有时您会看到 << _<< EOD,或 mongo 是否可以读取它们。否则请查看expect。祝你好运。
  • 作为shellter,说,使用here document。如果这不起作用(某些命令不允许重定向 stdin),请选择基于 expect 的解决方案。
  • 谢谢,我去看看。

标签: bash shell unix process read-eval-print-loop


【解决方案1】:

您可以编写一个expect 脚本,它会交互式地为您输入这些命令。我不是普通的期望用户,但我认为它应该看起来像这样:

#!/usr/bin/expect
mongo
set timeout 10
expect "MongoDB shell version: 2.4.8"
send "db.collections"
expect "test.collections"
send exit

那里有很多示例,可以轻松创建最小的工作示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多