2

我的 bash 脚本如下所示:

read -p "Do you wish to continue?" yn
# further actions ...

我只想使用 nodejs / child_process 与这个脚本进行交互。如何检测到它正在等待用户输入?

var spawn = require('child_process').spawn;
var proc = spawn('./script.sh');
proc.stdout.on("data", function(data) {
  console.log("Data from bash");
}
proc.stdin.on("data", function(data) {
  console.log("Data from bash"); // doesn't work :/
}

谢谢!

4

2 回答 2

1

您是否尝试使用“期望” http://en.wikipedia.org/wiki/Expect?它是一个“预期”一些文本(它使用正则表达式)并且 bash 脚本可以自动回答的工具。

于 2012-12-18T23:23:16.397 回答
1

bash 手册页

read -p prompt

在尝试读取任何输入之前,在标准错误上显示提示,不带尾随换行符。只有当输入来自终端时才会显示提示。

而且我认为 node.js 中没有任何方法可以检测到脚本正在等待输入。问题实际上是 bash 检测到非终端并禁用输出到标准错误。即使这样,您也必须从 stderr 而不是 stdin 读取来检测任何等待状态

最后,正如 Antoine 指出的那样,您可能必须使用诸如emptyExpect之类的工具来包装您的 shell 脚本并欺骗 Bash 使其认为它位于终端中。

顺便说一句:proc.stdin.write("yes\n")工作正常。因此,您可以使用脚本,但不会收到任何提示,proc.stderr并且不知道脚本何时实际读取输入。proc.stdin.write即使脚本尚未在read -p语句中,您也可以立即输入。输入被缓冲,直到脚本吃掉它。

于 2012-12-19T11:06:58.590 回答