在Node.js中执行bash命令并获取退出代码

mba*_*ski 35 bash exit-code node.js

我可以在node.js中运行bash命令,如下所示:

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

function puts(error, stdout, stderr) { sys.puts(stdout) }
exec("ls -la", function(err, stdout, stderr) {
  console.log(stdout);
});
Run Code Online (Sandbox Code Playgroud)

如何获取该命令的退出代码(ls -la在此示例中)?我试过跑步

exec("ls -la", function(err, stdout, stderr) {
  exec("echo $?", function(err, stdout, stderr) {
    console.log(stdout);
  });
});
Run Code Online (Sandbox Code Playgroud)

不管以前命令的退出代码如何,这总是返回0.我错过了什么?

Joe*_*Joe 47

这两个命令在单独的shell中运行.

要获取代码,您应该能够检err.code入回调.

如果这不起作用,则需要添加exit事件处理程序

例如

dir = exec("ls -la", function(err, stdout, stderr) {
  if (err) {
    // should have err.code here?  
  }
  console.log(stdout);
});

dir.on('exit', function (code) {
  // exit code is code
});
Run Code Online (Sandbox Code Playgroud)

  • 对于那些对同步版本感兴趣的人,还有 `execSync(command[, options])`。https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options (2认同)

and*_*lrc 7

从文档:

如果callback提供了函数,则使用arguments调用它(error, stdout, stderr)error一旦成功,将是null。发生错误时,error将是Error的一个实例。该error.code属性将是子进程的退出代码,同时error.signal将其设置为终止该进程的信号。除0以外的任何退出代码均被视为错误。

所以:

exec('...', function(error, stdout, stderr) {
  if (error) {
    console.log(error.code);
  }
});
Run Code Online (Sandbox Code Playgroud)

应该管用。


Cir*_*四事件 5

child_process.spawnSync()

这个函数公开了最好的同步接口:https : //nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options

例子:

#!/usr/bin/env node

const child_process = require('child_process');
let out;

out = child_process.spawnSync('true');
console.log('status: ' + out.status);
console.log('stdout: ' + out.stdout.toString('utf8'));
console.log('stderr: ' + out.stderr.toString('utf8'));
console.log();

out = child_process.spawnSync('false');
console.log('status: ' + out.status);
console.log('stdout: ' + out.stdout.toString('utf8'));
console.log('stderr: ' + out.stderr.toString('utf8'));
console.log();

out = child_process.spawnSync('echo', ['abc']);
console.log('status: ' + out.status);
console.log('stdout: ' + out.stdout.toString('utf8'));
console.log('stderr: ' + out.stderr.toString('utf8'));
console.log();
Run Code Online (Sandbox Code Playgroud)

输出:

status: 0
stdout: 
stderr: 

status: 1
stdout: 
stderr: 

status: 0
stdout: abc

stderr: 

Run Code Online (Sandbox Code Playgroud)

在 Node.js v10.15.1、Ubuntu 19.10 中测试。