2016-05-08 25 views
1

練習として、node.jsのシステムコールを使用して/ tmpディレクトリに小さなテキストファイルを書き込もうとしています。ここに私のコードです:node.js:システムコールを使用して/ tmpディレクトリにファイルを書き込む際の問題

#!/bin/node 
var child_process = require("child_process"); 
var send = "Hello, world!"; 
child_process.exec('cat - > /tmp/test1', { input: send }); 

実際にファイルが作成されます。しかし、コンテンツはその中に置かれません。ものすごくハングアップします。誰かが私に行方不明を教えてもらえますか?

また、これを同期的に行う方法を知りたいと思います。

ありがとうございます。

... doug 
+1

入力とは何ですか?私は 'exec'のドキュメンテーションのどこにも見当たりません。私はあなたがこれのために 'spawn'を使う必要があると思います。 –

+0

Hmmm。私はそれに気付かなかった。すべての同期プロセスには入力オプションがあり、非同期プロセスには入力オプションはありません。 "input"はstdinに渡す文字列値です。前述のように、私はとにかく同期に切り替わりたいと思います。私の問題の一部は、ライブラリに変数を割り当てる必要があるときに私が混乱するということだと思います。私はそれに慣れていない。変数の名前も重要であるようです。あなたはそのことについていくつか光を当ててください。それが助けになると思います。 – user3311045

+0

私が追いかけるだけの方がいいかもしれない。 child_process.execではなくchild_process.execSyncを使用するように私のコードをどのように変更するのですか?私は、コードの2行目で "child_process.exec"を "child_process.execSync"に変更するだけで簡単にやり遂げることができると思います。しかし、それは動作していないようです。 exec.Syncメソッドが存在しないという苦情があります。 – user3311045

答えて

1

hm私もrtmを忘れていない限り、このコードはうまく動作しません。 cp.execの入力オプションはありません。

しかし、stdioオプションがあり、子供の期待されるstdioを開くことができます。

child_process.exec('cat - > /tmp/test1', { stdio: 'pipe' }); 

は、彼らは我々が終了することができますストリーム、ある、https://nodejs.org/api/child_process.html#child_process_options_stdio

stdio sが文字列ではありません参照/書き込み

は、標準入力があることをhttps://nodejs.org/api/stream.html

ノートを参照してください/パイプ/クローズ/プッシュなど書き込み可能なstdout/stderrが読み込み可能です。

stdinをcatと書くには、cp.stdinオブジェクトを使用してend()メソッドを呼び出します。

child_process.exec('cat - > /tmp/test1', { stdio: 'pipe' }).stdin.end('hello world'); 

endメソッドは、ストリームの終了が続くwriteで、catを終了するように指示する必要があることに注意してください。

これがうまくいくようにするには、stdinをファイルに送信しないようにリファクタリングし、代わりにchild.stdoutをprocess.stdoutにパイプする必要があります。

var child_process = require('child_process'); 
var cp = child_process.exec('cat -', { stdio: 'pipe' }); 
cp.stdin.end('hello world'); 
cp.stdout.pipe(process.stderr); 

プロセスはグローバルであることに注意してください。

+0

恐ろしい解決策。ありがとう。私はついに私が元々仕事に苦しんでいたことを得ました。私はそれを答えとして提供します。 – user3311045

1

私はついに私の元のアプローチを得ました。重大な障害は、同期メソッドがバージョン0.12(およびそれ以降)のnode.jsでのみ使用可能であることを知ることです。最終的に作業したコードは次のとおりです。

#!/usr/local/n/versions/node/0.12.14/bin/node 

var child_process = require('child_process'); 
var send = "Hello, world!" 
child_process.execSync('cat - > /tmp/test1', { input : send }).toString(); 

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

... doug 
関連する問題