Ejecute y obtenga la salida de un comando de shell en node.js


En un nodo.js, me gustaría encontrar una manera de obtener la salida de un comando de terminal Unix. ¿Hay alguna manera de hacer esto?

function getCommandOutput(commandString){
    // now how can I implement this function?
    // getCommandOutput("ls") should print the terminal output of the shell command "ls"
}
Author: Damjan Pavlica, 2012-10-17

4 answers

Esa es la forma en que lo hago en un proyecto en el que estoy trabajando ahora.

var exec = require('child_process').exec;
function execute(command, callback){
    exec(command, function(error, stdout, stderr){ callback(stdout); });
};

Ejemplo: Recuperar el usuario de git

module.exports.getGitUser = function(callback){
    execute("git config --global user.name", function(name){
        execute("git config --global user.email", function(email){
            callback({ name: name.replace("\n", ""), email: email.replace("\n", "") });
        });
    });
};
 92
Author: Renato Gama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-17 18:47:32

Estás buscando child_process

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

child = exec(command,
   function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
      if (error !== null) {
          console.log('exec error: ' + error);
      }
   });

Como señaló Renato, hay algunos paquetes exec síncronos por ahí ahora también, ver sync-exec que podría ser más lo que estoy buscando. Ten en cuenta, Node.js está diseñado para ser un servidor de red de alto rendimiento de un solo subproceso, por lo que si eso es para lo que está buscando usarlo, manténgase alejado de las cosas de sync-exec a menos que solo lo esté usando durante el inicio o algo así.

 18
Author: hexist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-17 18:59:59

Si está usando node después de la versión 7.6 y no le gusta el estilo de devolución de llamada, también puede usar la función promisify de node-util con async / await para obtener comandos de shell que se lean limpiamente. He aquí un ejemplo de la respuesta aceptada, usando esta técnica:

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

module.exports.getGitUser = async function getGitUser () {
  const name = await exec('git config --global user.name')
  const email = await exec('git config --global user.email')
  return { name, email }
};

Esto también tiene el beneficio añadido de devolver una promesa rechazada en los comandos fallidos, que se puede manejar con try / catch dentro del código async.

 4
Author: Ansikt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-14 16:30:59

Gracias a Renato answer, he creado un ejemplo realmente básico:

const exec = require('child_process').exec

exec("git config --global user.name", (err, stdout, stderr) => console.log(stdout))
 1
Author: Damjan Pavlica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 13:15:42