Node.js child.stdout.on使用read但不使用read-p
我正在尝试创建一个简单的节点API,它将生成一个shell脚本,并将POST调用中的用户输入添加到该生成中。我创建了一个名为testController.js的控制器,它将运行位于同一项目中的名为test.sh的脚本 我在编写用户输入时遇到了一些问题,但谢天谢地,这个解决方案救了我 因此,这个非常简单的控制器功能最终是: testController.js: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
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。