Shell命令执行

时间:2013-05-13 09:03:15

标签: javascript livescript

我正在尝试实现我在此处找到的shell命令执行:node.js shell command execution

所以我试图得到第二个答案(Chris 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 个答案:

答案 0 :(得分:1)

您没有看到结果,因为run_cmd运行async,并且在运行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

在这里,我们看到使用了多个LS特征,如无paren-chaining(spawn行),无大括号对象定义(result行),级联(..on..log (),后跟(<-!),单词数组(<[ array of words ]>)和隐式参数(it)。有关它们的更多信息,请参阅LiveScript文档。