nodejs - Ejecute y obtenga la salida de un comando de shell en node.js
npm (4)
Así es como 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: Recuperando usuario 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", "") });
});
});
};
En un node.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"
}
Estas 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, ahora también hay algunos paquetes exec síncronos, vea This que podría ser más lo que está buscando. Sin embargo, tenga en cuenta que node.js está diseñado para ser un servidor de red de alto rendimiento de un solo subproceso, por lo que si es para lo que quiere usarlo, manténgase alejado de las cosas de sync-exec a menos que solo lo esté utilizando durante el inicio o algo.
Gracias a la respuesta de Renato, he creado un ejemplo muy básico:
const exec = require(''child_process'').exec
exec("git config --global user.name", (err, stdout, stderr) => console.log(stdout))
Si está usando un nodo posterior a 7.6 y no le gusta el estilo de devolución de llamada, también puede usar la función promisify
node-util con async / await
promisify
para obtener comandos de shell que se lean de forma limpia. Aquí hay un ejemplo de la respuesta aceptada, utilizando 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 la ventaja adicional de devolver una promesa rechazada en los comandos fallidos, que se pueden manejar con try / catch
dentro del código asíncrono.