2016-11-19 19 views
0

NodeJSで新しいプロセスを生成する必要があります。そのstderrはstdoutにリダイレクトする必要があります(bashの2>&1と同じです)。NodeJSで新しいプロセスを生成し、stderrをstdoutにリダイレクトする方法は?

proc.js

var child_process = require('child_process'); 

var opt = {stdio: ['ignore', 'pipe', 'pipe']}; 
var proc = child_process.spawn('./myscript', [], opt); 
proc.stderr.pipe(proc.stdout); 
proc.stdout.on('data', function (buf) { 
    console.log('stdout', buf.toString()); 
}); 
proc.on('error', function (...args) { 
    console.log('error', args); 
}); 
proc.on('exit', function (code, signal) { 
    console.log('exit', code, signal); 
}); 
proc.on('close', function (code, signal) { 
    console.log('close', code, signal); 
}); 

のMyScript

#!/bin/bash 

echo 111 
echo 222 >&1 
echo 333 >&2 
echo 444 

残念ながら、これは動作しません。出力にははありません。

stdout 111 
222 
444 

exit 0 null 
close 0 null 
+0

実用的な観点から...なぜですか? Linuxリダイレクトではなく、スクリプト内でこれを制御したいのはなぜですか? – Paul

答えて

3

私はあなたの問題はあなたではなくあなた自身の標準出力よりも、それ自身の標準出力に子(PROC)標準エラー出力をパイプしていると思います。 proc.stdoutはソースでありシンクではないので、別のパイプから入力を受け取ることはできません。

何をしたいたぶん

され、代わりに:

proc.stderr.pipe(proc.stdout); 

この:

proc.stderr.pipe(process.stdout); 

process.stdoutがシンクであるあなたの親プロセスの標準出力、であるので、それはproc.stderrを取ることができますこれはソースです。

+2

またはノードの用語では、proc.stdoutはReadableStreamですが、process.stdoutはWriteableStreamです – Paul

+1

私は明らかに言葉を持っています。私はgazintahとgazoutahを使うつもりだったが、流し台とソースに着いた。 :-) –

関連する問題