2017-10-20 4 views
2

私は端末でうまく動作するシェルコマンドを持っていますが、ノードのchild_processによって実行されたときにエラーが発生します。ここノードのchild_processで奇妙なパイプの動作?

cat /tmp/file.json | jq 

child_processから同じコマンドを実行している:ここ

端末で使用されるコマンド(file.jsonはJSONファイルである)ある

var cp = require("child_process"); 

var command = "cat /tmp/gen_json | jq"; 
cp.exec(command, function(err, stdout, stderr) { 
    stderr ? console.log(stderr) : console.log(stdout); 
}); 

生成する:

jq - commandline JSON processor [version 1.5-1-a5b5cbe] 
Usage: jq [options] <jq filter> [file...] 

    jq is a tool for processing JSON inputs, applying the 
    given filter to its JSON text inputs and producing the 
    ... 

これはjqを実行したときに表示されるデフォルトのメッセージです。先ほどのパイプなしでjqを実行したようです。

+0

パイプの動作に関連していない、しかし、あなたはここで 'cat'を必要としません:

var command = "cat /tmp/gen_json | jq ."; 

または、(ネコ虐待を避けるために)さらに良い:あなたが明示的に指定する必要が理由です(それがあなたが走っている実際のコマンドの場合)。 'jq '..filter'/tmp/file.json'を試してください。 – randomir

+0

私の場合、@randomir 'cat'が必要です。 'jq/tmp/file.json'を実行すると' unexpected '/' 'で壊れます。 'cat'が' jq'の前にファイルを解析するようにすると、私はそのエラーに遭遇しません。 (pastebinでjsonに更新された質問) –

+1

'jq'のように見えます。 jq '。' '。これはあなたの他の問題を解決します: 'jq '。'ファイル 'を生成する。 – randomir

答えて

1

フィルタが省略された場合、catchはjqattempts to intelligently infer the default filterになります。出力は、端子(TTY)になると

すなわち、フィルタは.(かなり印刷)にデフォルトをを省略してもよいです。

cat file | jq   # or: jq < file 

の代わり:ターミナルにあなたが書くことができる理由です

cat file | jq .   # or: jq . file 

nodeから呼び出された場合には、しかし、stdinstdoutをリダイレクトし、jqフィルタ引数が必要です。

var command = "jq . /tmp/gen_json"; 
+1

'jq '.''は次のように単純化できます。' jq。' – peak

+1

これは本当です、更新されました。ありがとう! – randomir