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"
}
4 answers
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", "") });
});
});
};
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.
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.
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))