如何将STDIN传递给node.js子进程

时间:2016-06-07 17:17:36

标签: node.js command-line-interface

我正在使用为节点包装pandoc的库。但我无法弄清楚如何将STDIN传递给子进程`execFile ...

var execFile = require('child_process').execFile;
var optipng = require('pandoc-bin').path;

// STDIN SHOULD GO HERE!
execFile(optipng, ['--from=markdown', '--to=html'], function (err, stdout, stderr) {
    console.log(err);
    console.log(stdout);
    console.log(stderr);
});

在CLI上它看起来像这样:

echo "# Hello World" | pandoc -f markdown -t html

更新1

尝试使用spawn

var cp = require('child_process');
var optipng = require('pandoc-bin').path;
var child = cp.spawn(optipng, ['--from=markdown', '--to=html'], { stdio: [ 0, 'pipe', 'pipe' ] });

child.stdin.write('# HELLO');
// then what?

4 个答案:

答案 0 :(得分:8)

spawn()一样,execFile()也会返回ChildProcess个实例,该实例具有stdin可写流。

作为使用write()并聆听data事件的替代方法,您可以创建readable streampush()输入数据,然后pipe()它到<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="wrapper"> <button class="add_ingredient">Add Ingredient</button> </div>

child.stdin

答案 1 :(得分:6)

以下是我如何使用它:

var cp = require('child_process');
var optipng = require('pandoc-bin').path; //This is a path to a command
var child = cp.spawn(optipng, ['--from=markdown', '--to=html']); //the array is the arguments

child.stdin.write('# HELLO'); //my command takes a markdown string...

child.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});
child.stdin.end();

答案 2 :(得分:1)

我不确定是否可以STDIN根据这些docs使用child_process.execFile()以及下面的摘录,看起来仅适用于child_process.spawn()

  

child_process.execFile()函数类似于child_process.exec(),但它不会生成shell。相反,指定的可执行文件直接作为新进程生成,使其比child_process.exec()稍微更高效。

答案 3 :(得分:0)

字符串为STDIN

如果您正在使用同步方法(execFileSyncexecSyncspawnSync),则可以使用input传递字符串作为stdin 输入选项。像这样:

const child_process = require("child_process");
const str = "some string";
const result = child_process.spawnSync("somecommand", ["arg1", "arg2"], { input: str });