2013-05-13 255 views
1

我試圖執行shell命令的執行,我發現在這裏:node.js shell command executionShell命令執行

所以我試圖讓第二個答案(由克里斯Eineke)​​工作。但現在我沒有輸出。

這裏是我的嘗試:

run_cmd = (cmd, args, done) -> 
    spawn = require('child_process').spawn 
    child = spawn(cmd, args) 
    result = { stdout: '' }; 
    child.stdout.on \data ! (buffer) -> 
     result.stdout += buffer 
    child.stdout.on \end !-> done() 
    result 

dir = run_cmd(
    'ls', ['-a'] 
    , !-> console.log('done') 
    ) 

console.log dir.stdout 

其編譯爲:

run_cmd = function(cmd, args, done){ 
    var spawn, child, result; 
    spawn = require('child_process').spawn; 
    child = spawn(cmd, args); 
    result = { 
     stdout: '' 
    }; 
    child.stdout.on('data', function(buffer){ 
     result.stdout += buffer; 
    }); 
    child.stdout.on('end', function(){ 
     done(); 
    }); 
    return result; 
    }; 
    dir = run_cmd('ls', ['-a'], function(){ 
    console.log('done'); 
    }); 
    console.log(dir.stdout); 

但我不能看到ls結果。我的錯誤在哪裏?或者我做錯了什麼?

回答

1

您沒有看到結果,因爲run_cmd運行異步並且運行console.log dir.stdout時結果爲空。您應該將結果傳遞給您的回調並在那裏進行記錄。這裏有一個工作的LiveScript版本:

run_cmd = !(cmd, args, done) -> 
    spawn = require 'child_process' .spawn 
    child = spawn cmd, args 
    result = stdout: '' 
    child.stdout 
    ..on \data !(buffer) -> 
     result.stdout += buffer 
    ..on \end !-> 
     done result 

<-! run_cmd \ls <[ -a ]> 
console 
    ..log \done 
    ..log it.stdout 

這裏我們可以看到使用,如免費的括號 - 鏈接(spawn線),braceless對象定義(result線),級聯(在..on..log線),backcalls多個LS功能(<-! ),字數組(<[ array of words ]>)和隱式參數(it)。有關更多信息,請參閱LiveScript文檔。