2013-05-13 258 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文档。