使用nodejs将javascript变量传递给shell命令

时间:2016-09-04 08:13:29

标签: javascript node.js bash shell

我正在研究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 个答案:

答案 0 :(得分:3)

在这里,您使用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 :(得分:0)

使用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');

希望我能帮到你