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)
从文档:
如果
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)
应该管用。
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 中测试。