2013-07-25 6 views
4

stdout에서 수정 된 내용을 읽기 전에 하위 프로세스를 실행하여 두 단계로 파일을 수정하려고합니다. bash에서 완벽하게 작동하는 프로세스 대체를 사용하여이를 수행하려고하지만 노드에서 시도 할 때 그렇지 않습니다.프로세스 대체 - Node.js child_process

이 명령이

var p = exec('command2 <(capture /dev/stdout | command1 -i file -) -', 
function (error, stdout, stderr) { 
    console.log(stderr); 
}); 

stderr에 인쇄 .. 어떻게 생겼는지, 가지입니다 :

/bin/sh: -c: line 0: syntax error near unexpected token `(' 

노드에서이 일을 적절한 방법은 무엇입니까?

답변

3

나는 이것을 쉘 스크립트에 넣고 노드 자식 프로세스에서 스크립트를 호출하여 해결했다. 나는 또한이 과정을 대체 할 수 있도록 POSIX 모드에서 bash는 설정에 다음 사항을 추가하는 데 필요한 :이 아마 직접 노드 내에서이 일을 더 좋은 방법이지만이 일을했다

set +o posix 

. 건배!

0

사용자는 bash가 bash -c 'command'으로 명령을 평가할 수 있습니다. 나는 이것을 테스트했고 프로세스 대체 및 child_process와 함께 작동합니다.

1

-c 플래그와 함께 sh 명령을 호출하여 노드에 bash 대체가있는 child_processchild_process을 입력 할 수 있습니다.

sh 명령은 기본 bash 인터프리터를 사용하고 -c 플래그는 인터프리터에게 문자열 내에서 명령을 읽도록 요청합니다 (예 : $(echo $PATH)). 그런 다음 추가 플래그가 $0, $1 등의 정상 위치 참조로 전달됩니다.

그래서 예는 다음과 같을 수 있습니다

const spawn = require('child_process').spawn; 

const prg = 'sh', 

    args = [ 
     '-c', 
     'echo $($0 $1)', 
     'ls', // $0 
     '-la' // $1 
    ], 

    opts = { 
     stdio: 'inherit' 
    }; 

// Print a directory listing, Eg: 'ls -la' 
const child = spawn(prg, args, opts); 
관련 문제