我正在尝试创建一个简单的节点 API,它将生成一个 shell 脚本并将来自 POST 调用的用户输入添加到该生成。我创建了一个名为 testController.js 的控制器,它将运行位于同一项目中的名为 test.sh 的脚本
我在编写用户输入时遇到了一些问题,但幸运的是这个解决方案救了我。
所以这个非常简单的控制器功能最终是:
测试控制器.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");
};
我的 shell 脚本基本上只需要一个名称和编号,然后将这些详细信息导出到一个文件中:
test.sh:
#!/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
但是,为了进一步简化事情,我决定用更简单的 ie 替换不必要的 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?我的功能有什么需要改变的吗?它不是普通的标准输出流而是别的东西吗?