2017-10-20 2 views
2

터미널에서 잘 작동하는 셸 명령을 가지고 있는데 노드의 child_process 오류가 발생하면 오류가 발생합니다.노드의 child_process에서 이상한 파이프 동작이 발생합니까?

여기
cat /tmp/file.json | jq 

child_process로부터 동일한 명령을 실행한다 : 생성

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); 
}); 

:

여기

단말기 에 (file.json JSON 파일 인) 사용 된 명령이고
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' 필요하지 않습니다 (그것이 실제 명령 인 경우). 'jq '..filter ..'/ tmp/file.json'을 시도해보십시오. – randomir

+0

제 경우에는 @randomir'cat'이 필요합니다.'jq/tmp/file.json'을 실행하면'unexpected '/''로 중단되기 때문입니다. 나는'cat'이'jq' 전에 파일을 파싱하게 할 때 그 오류를 얻지 못합니다. (pastebin으로 json으로 업데이트 된 질문) –

+1

'jq'는 필수 필터가 필요합니다. 시도해보십시오 :'cat file | jq '.' '. 이것은 다른 문제도 해결합니다 :'jq '.' 파일 '. – randomir

답변

1

필터가 생략 된 경우 캐치는 jqattempts to intelligently infer the default filter입니다. 출력은 단말기 (TTY)로 이행 한 경우

즉, 상기 필터 . (꽤 인쇄)에 디폴트을 생략하고, 될 수있다. 즉 터미널에서 당신이 쓸 수있는 이유는 다음과 같습니다 대신

cat file | jq   # or: jq < file 

:

cat file | jq .   # or: jq . file 

stdin으로, 그러나, node에서 호출 및 stdout, jq리디렉션 필터 인수가 필요합니다. 더 나은 (고양이과 남용 방지하기 위해),

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

또는 : 당신이 명시 적으로 지정해야하는 이유입니다

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

'jq '.''은 다음과 같이 단순화 될 수 있습니다 :'jq.' – peak

+1

사실입니다. 업데이트되었습니다. 감사! – randomir

관련 문제