如何从 javascript 中的 child_process.exec 获取返回值?

J.R*_*.R. 8 javascript node.js

我尝试了以下代码,它显示 res 未定义。我怎样才能返回标准输出?

function run_shell_command(command)
{
    var res
    exec(command, function(err,stdout,stderr){
     if(err) {
        console.log('shell error:'+stderr);
    } else {
        console.log('shell successful');
    }
    res = stdout
    // console.log(stdout)
    });
    return res
} 
Run Code Online (Sandbox Code Playgroud)

0.s*_*.sh 10

除非您使用exec函数的同步版本,否则您无法获得返回值。如果你仍然坚持这样做,你应该使用回调

function run_shell_command(command,cb) {   
    exec(command, function(err,stdout,stderr){
        if(err) {
          cb(stderr);
        } else {
          cb(stdout);
       }
   });
}

run_shell_command("ls", function (result) { 
   // handle errors here
} );
Run Code Online (Sandbox Code Playgroud)

或者您可以将 exec 调用包装在一个承诺中并使用 async await

const util = require("util");
const { exec } = require("child_process");
const execProm = util.promisify(exec);

async function run_shell_command(command) {
   let result;
   try {
     result = await execProm(command);
   } catch(ex) {
      result = ex;
   }
   if ( Error[Symbol.hasInstance](result) )
       return ;

   return result;
}


run_shell_command("ls").then( res => console.log(res) );
Run Code Online (Sandbox Code Playgroud)


小智 5

2022 年可以更简单地完成:

var r = execSync("ifconfig");
console.log(r);
Run Code Online (Sandbox Code Playgroud)

您必须像这样导入:

const execSync = require("child_process").execSync;
Run Code Online (Sandbox Code Playgroud)