Node.js child.stdout.on使用read但不使用read-p

Node.js child.stdout.on使用read但不使用read-p,node.js,bash,shell,Node.js,Bash,Shell,我正在尝试创建一个简单的节点API,它将生成一个shell脚本,并将POST调用中的用户输入添加到该生成中。我创建了一个名为testController.js的控制器,它将运行位于同一项目中的名为test.sh的脚本 我在编写用户输入时遇到了一些问题,但谢天谢地,这个解决方案救了我 因此,这个非常简单的控制器功能最终是: testController.js: exports.create_task = function (req, res) { var spawn = require(&qu

我正在尝试创建一个简单的节点API,它将生成一个shell脚本,并将POST调用中的用户输入添加到该生成中。我创建了一个名为testController.js的控制器,它将运行位于同一项目中的名为test.sh的脚本

我在编写用户输入时遇到了一些问题,但谢天谢地,这个解决方案救了我

因此,这个非常简单的控制器功能最终是:

testController.js

exports.create_task = function (req, res) {
  var spawn = require("child_process").spawn;
  var spawned = spawn("sh", ["/var/www/html/node_test_proj/test.sh"]);
  spawned.stdout.on("data", function (data) {
    console.log("In stdout");
    spawned.stdin.write(req.body.name + "\n");
    spawned.stdin.write(req.body.number + "\n");
  });
  res.send("posted");
};
#!/bin/bash
echo "Please input your name"
read name
echo "Please input your number"
read number
echo "Your name is $name and number $number" > knowingthis.txt;
我的shell脚本基本上只需要一个名称和编号,然后将这些详细信息导出到一个文件中:
测试。sh

exports.create_task = function (req, res) {
  var spawn = require("child_process").spawn;
  var spawned = spawn("sh", ["/var/www/html/node_test_proj/test.sh"]);
  spawned.stdout.on("data", function (data) {
    console.log("In stdout");
    spawned.stdin.write(req.body.name + "\n");
    spawned.stdin.write(req.body.number + "\n");
  });
  res.send("posted");
};
#!/bin/bash
echo "Please input your name"
read name
echo "Please input your number"
read number
echo "Your name is $name and number $number" > knowingthis.txt;
足够简单;完成它应该做的,并(给出名称abc和编号123)打印出:

你的名字是abc,号码是123

然而,为了进一步简化,我决定用更简单的语句来替换不必要的echo语句,即
read-p
。现在,我修改的脚本变成:

#!/bin/bash
read -p "Please input your name: " name;
read -p "Please input your number: " number;
echo "Your name is $name and number $number" > knowingthis.txt;
瞧!现在,当我生成脚本时,它不再工作;它甚至不记录“In stdout”,因此这意味着它永远不会真正进入该子句,它只是导出语句中变量为空的文件,将输出保留为:

你的姓名和电话号码是多少


我想可能是脚本出了问题,所以我直接运行了它,但效果很好。为什么它使用的是
read
,而不是
read-p
?我的功能是否需要更改?它不是一个正常的标准输出流,而是其他的吗?

手册页部分,或信息页,或者,对于
读取
选项
-p
下的内置命令说(添加了强调)

在尝试读取任何输入之前,显示提示,不带尾随换行符。仅当输入来自终端时,才会显示提示

“来自”是指直接,即仅当shell进程的文件描述符#0(stdin)是一个打开的文件时,它是一个终端,而不是(重定向的)磁盘文件或管道或套接字。当
nodejs
生成子进程时,子进程的stdin是来自nodejs的管道,子进程的stdout和stderr是指向nodejs的管道;它们(全部)不是终端


OTOH
echo
无条件地写入标准输出(不管它是什么类型的文件)。

Oh是有意义的。因此,我想更简单的方法是采用echo和read方法,而不是使用read-p。