2011-08-24 47 views
7

我試圖在node.js中同步執行一個child_process(是的,我知道這很糟糕,我有一個很好的理由)並檢索標準輸出上的任何輸出,但我不知道如何...node.js - 同步執行命令並獲得結果

我發現這個帖子:node.js execute system command synchronously,它描述瞭如何使用庫(節點ffi)來執行命令,這很好,但唯一的事情,我'能夠得到的是進程退出代碼。該命令執行的任何數據都直接發送到stdout - 我如何捕獲這個?

> run('whoami') 
username 
0 

。換句話說,username被回顯到stdout,的run結果是0

我最好而想出如何閱讀標準輸出

+0

試着看[這裏] [1]。這是同一個問題的討論。 [1]:http://stackoverflow.com/questions/4443597/node-js-execute-system-command-synchronously/8625316#8625316 – scherka

回答

2

所以我有一個解決方案的工作,但不完全一樣...只是張貼在這裏以供參考:

我正在使用其他SO帖子中引用的node-ffi庫。我有一個功能:

  • 發生在一個給定的命令
  • 追加>> run-sync-output
  • 執行它
  • 讀取run-sync-output同步,並將結果存儲
  • 刪除該tmp文件
  • 返回結果

有一個如果用戶沒有對當前目錄的寫訪問權限,則會失敗。另外,這只是浪費精力。 : -/

-2

除了寫代碼有點不同外,實際上沒有任何理由去做任何同步。

你不喜歡這個? (docs

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

exec('whoami', function (error, username) { 
    console.log('stdout: %s', username); 
    continueWithYourCode(); 
}); 
+0

實際上有在這種情況下。我有一個鉤入'手寫筆'的庫,可以從單個圖像中編譯CSS精靈。由於'stylus'是同步寫入的,所以任何鉤子都必須同步。我不打算重寫整個解析引擎,即使我這樣做了,它可能不會被接受到主分支中,而我的外部庫只能在我的分支上工作。 –

+5

-1「沒有理由......」,你怎麼知道?我討厭這些無法證明是正確的毫無意義的論點,實際上你錯了,有幾種情況是必須的,或者是同時做事情的幫助。 – Tower

+0

@rFactor:實際上沒有理由。您可以說因爲您習慣了它,所以您更容易對正在同步的代碼進行修改,但實際上沒有任何理由。 – dresende

1

我已經建立了解決這一確切的問題使Node.js的模塊。檢查出來:)

exec-plan

更新

以上模塊解決您原來的問題,因爲它允許子進程的同步鏈接。鏈中的每個鏈接都會從鏈中的前一個進程獲取stdout。

+0

這個模塊中的哪些方法可以用來獲取命令的輸出? –

+0

該模塊的意圖是設置一個命令鏈作爲一個計劃,stdout/err將可用於計劃中的「下一個」命令的「preLogic」功能。所以,例如:如果你有execPlan.add('ps -ef');然後,在您的下一個「添加」中,可以使用「預邏輯」功能作爲第一個使用「ps -ef」輸出的參數。例如:execPlan.add(function(stdout){//在'grep ls'},'grep ls');之前運行'ps -ef'的stdout。如果這個評論沒有很好的闡明,你可以在模塊的github網站上發佈嗎?此外,檢出README.md :) – Ryan

+0

是否可以使用此模塊將命令行輸出作爲字符串返回(而不是僅使用console.log打印它) –

1

我有一個類似的問題,我最終爲此寫了一個節點擴展。你可以檢出git倉庫。它是開源的,免費的,所有這些好東西!

https://github.com/aponxi/npm-execxi

ExecXI是一個節點的擴展用C++編寫執行shell命令 一個接一個,在 實時輸出命令輸出到控制檯。目前存在可選的鏈式和非鏈式方式;意思是 ,你可以選擇在命令失敗後停止腳本 (鏈接),或者你可以繼續,就好像什麼也沒有發生!

使用說明在ReadMe file。隨意提出請求或提交問題!

但是它並沒有返回標準輸出呢......我今天剛剛發佈了它。也許我們可以建立它。

無論如何,我認爲這值得一提。我也發佈了這個類似的問題:node.js execute system command synchronously