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

时间:2016-06-09 17:13:33

标签: node.js bash exit-code

我可以在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);
});

如何获取该命令的退出代码(本例中为ls -la)?我试过了

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

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

4 个答案:

答案 0 :(得分:33)

这两个命令在不同的shell中运行。

要获取代码,您应该可以在回调中查看err.code

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

e.g。

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
});

答案 1 :(得分:5)

来自文档:

  

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

所以:

exec('...', function(error, stdout, stderr) {
  if (error) {
    console.log(error.code);
  }
});

应该工作。

答案 2 :(得分:1)

在节点文档中,我找到了回调函数的这些信息:

成功时,错误将为空。出错时,错误将是错误的实例。 error.code属性将是子进程的退出代码,而error.signal将设置为终止进程的信号。除0以外的任何退出代码都被视为错误。

答案 3 :(得分:0)

import { Dimensions , StatusBar } from 'react-native'; const screenHeight = Dimensions.get('screen').height; const windowHeight = Dimensions.get('window').height; const navbarHeight = screenHeight - windowHeight + StatusBar.currentHeight;

此功能公开了最好的同步界面:https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options

示例:

child_process.spawnSync()

输出:

#!/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();

在Ubuntu.19.10的Node.js v10.15.1中进行了测试。