Execute e obtenha a saída de um comando shell no nó.js

num nó.js, eu gostaria de encontrar uma maneira de obter a saída de um comando de terminal Unix. Há alguma maneira de fazer isto?

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

É assim que faço num projecto que estou a trabalhar.
var exec = require('child_process').exec;
function execute(command, callback){
    exec(command, function(error, stdout, stderr){ callback(stdout); });
};

Exemplo: a obter o utilizador do 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, 2012-10-17 18:47:32

Estás à procura de processo Infantil

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 indicado pelo Renato, existem alguns pacotes exec síncronos também lá fora, veja sync-exec que pode ser mais do que você está procurando. Mas lembra-te, node.js é projetado para ser um servidor de rede de alta performance, por isso, se é para isso que você está olhando para usá-lo, fique longe do tipo sync-exec, a menos que você só está usando isso durante a inicialização ou algo assim.

 18
Author: hexist, 2012-10-17 18:59:59

Se estiver a usar o node mais tarde do que 7. 6 e não gostar do estilo de callback, também poderá usar a função node-util's promisify com async / await para obter os comandos da linha de comandos que sejam lidos de forma limpa. Aqui está um exemplo da resposta aceita, 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 }
};

Isto também tem o benefício adicional de devolver uma promessa rejeitada em comandos falhados, que podem ser tratados com try / catch dentro do Código async.

 4
Author: Ansikt, 2018-05-14 16:30:59

Graças à resposta do Renato, criei um exemplo 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, 2018-07-17 13:15:42