2

我正在尝试创建一个简单的节点 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?我的功能有什么需要改变的吗?它不是普通的标准输出流而是别的东西吗?

4

1 回答 1

3

选项下的内置命令的手册页部分或信息页面或网站页面说(强调添加)read-p

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

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

OTOHecho无条件地写入标准输出(无论它是什么类型的文件)。

于 2021-04-12T08:27:42.117 回答