2016-09-04 6 views
3

私はnodejsアプリケーションで作業しており、複数行の文字列をシェルコマンドにパイプする必要があります。私は、シェルスクリプトではプロではないが、私は自分の端末でこのコマンドを実行するとそれだけで正常に動作します:javascript変数をnodejsでシェルコマンドにパイプ

$((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(); 

ありがとうございました!

答えて

1

ここでは、spawnを使用してbashを起動していますが、execoneを使用してdayoneプログラムを開始しています。それらは独立した子プロセスであり、決して接続されません。

'cp'はchild_processモジュールへの参照にすぎず、spawnとexecは子プロセスを開始する2つの異なる方法です。

dayoneを起動するためにdayoneコマンドをstdinに書くことができます(あなたのスニペットがしようとしているようです)、あるいはexecで直接dayoneを呼び出すこともできます(execはまだコマンドを実行しています)シェルで:Readable Streams

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(); 
+0

これは完全に動作しますが、なぜ私は分かりません。 'stdin'に書き込む前に' cp.exec'を呼び出すのは、何かが読み込まれる前に 'dayone'コマンドを実行するようです。 'dayone'コマンドがどのように入力を得るのか説明できますか?ありがとう! – danseethaler

+1

execコマンドはdayoneの完了/終了を待たず、node.jsブロックには何もしません。 Execはプロセスを開始し、プロセスはstdinからの読み込みを試みます。利用可能なものがない場合は、処理が開始されるとすぐに提供するものが存在するまでブロックされます。コマンドラインから手動で実行した場合と同様に、標準入力に何か入力するまでブロックされます。 –

+0

完璧!本当にありがとう! – danseethaler

0

それはあなたがstdoutに書き込むことができますWritable 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()); 
    } 
}); 

を聞くことはとても簡単です

process.stdout.write('Multi\nline\nstring'); 

うまくいけば私はあなたを助けることができました

関連する問題