使用Node.js将JavaScript变量传递到shell命令中的管道

6
我正在开发一个nodejs应用程序,需要将多行字符串传输到shell命令中。我不是shell脚本的专家,但如果在终端中运行此命令,则可以正常工作:

$((cat $filePath) | dayone new)

这是我为nodejs准备的代码。dayone命令确实有效,但没有任何内容被传输到其中。
const cp = require('child_process');
const terminal = cp.spawn('bash');

var multiLineVariable = 'Multi\nline\nstring';

terminal.stdin.write('mul');
cp.exec('dayone new', (error, stdout, stderr) => {
    console.log(error, stdout, stderr);
});
terminal.stdin.end();

感谢您的任何帮助!
2个回答

5
这里,您正在使用spawn启动bash,但之后您又使用exec来启动dayone程序。它们是独立的子进程,没有任何联系。
'cp'只是child_process模块的引用,而spawn和exec只是启动子进程的两种不同方式。
您可以使用bash并将dayone命令写入stdin以调用dayone(正如您的片段似乎要做的那样),或者您可以直接使用exec调用dayone(请注意,exec仍在shell中运行命令)。
var multiLineVariable = 'Multi\nline\nstring';

// get the child_process module
const cp = require('child_process');

// open a child process
var process = cp.exec('dayone new', (error, stdout, stderr) => {
    console.log(error, stdout, stderr);
});

// write your multiline variable to the child process
process.stdin.write(multiLineVariable);
process.stdin.end();

1
这个代码完美地运行了,但我不确定为什么。似乎在写入stdin之前调用cp.exec会在有任何可读取的内容之前执行dayone命令。你能解释一下dayone命令如何获取输入吗?谢谢! - danseethaler
2
exec命令不会等待dayone完成/退出,因为node.js中没有任何阻塞。Exec只是启动进程,然后进程尝试从stdin读取。如果没有可用的内容,它将阻塞直到有内容可用,而我们在启动进程后立即提供内容,因此一定会有内容可用。就像您手动从命令行运行它一样,它将阻塞直到您在其stdin中键入了一些内容。 - Lee Marshall
太好了!非常感谢! - danseethaler

2
使用可读流(Readable Streams),监听输入非常容易。
const chunks = [];
process.stdin.on('readable', () => {
  const chunk = process.stdin.read()
  chunks.push(chunk);
  if (chunk !== null) {
    const result = Buffer.concat(chunks);
    console.log(result.toString());
  }
});

使用可写流(Writable Streams),您可以将内容写入标准输出(stdout)。
 process.stdout.write('Multi\nline\nstring');

希望我能帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接