2013-07-25 55 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); 
}); 

標準錯誤打印:

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

什麼是節點這樣做的正確方法?

回答

3

我通過將這些命令放入shell腳本並從節點子進程調用腳本來解決此問題。 我還需要添加以下設置的bash在POSIX模式,以允許進程替換:

set +o posix 

有可能是從節點中直接這樣做的更好的方式,但它做的工作。 乾杯!

0

你可以讓bash用bash -c 'command'評估命令。我測試過了,它可以和流程替換和child_process一起使用。

1

您可以spawn a child_process在節點中通過調用sh命令和-c標誌進行bash替換。

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