2012-02-03 43 views
1

如果我在Ruby中調用系統方法,它將在子shell中執行我的命令並輸出它所能做的所有事情。所以,如果我把這個file.rb:在Node.js中處理子shell的輸出

system 'vim' 

和運行$ ruby file.rb它啓動Vim的,所以我可以使用它。如果我做了我認爲是等同的Node.js,放入file.js:

var exec = require('child_process').exec; 
exec('vim'); 

和運行$ node file.js它啓動Vim的,但不輸出任何東西(除非我從孩子的過程和產出趕上標準輸出它自己,這不會很好)。我如何實現我在Ruby中使用Node做的事情?

回答

1

與Node中的許多函數一樣,返回值實際上並不是由函數調用本身返回,而是傳遞給作爲函數的最後一個參數傳遞的回調函數。此設計允許Node的主循環在子進程運行時處理其他任務。

如果你只想打印孩子的stdout輸出,你會做以下幾點:

var exec = require('child_process').exec; 

exec('vim', function (error, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
}); 

如果你也想輸出stderr和進程的退出代碼,試試這個:

exec('vim', function (error, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    console.log('exit code:', error ? error.code : 0); 
}); 

另外請注意,exec()只是一個方便的包裝spawn(),它提供了一個更強大的接口,並允許您使用流爲stdin,stdoutstderr

本示例取自節點的文檔here並略有修改。