Выполнить и получить вывод команды оболочки в node.js
В node.js я хотел бы найти способ получить вывод команды терминала Unix. Есть какой-либо способ сделать это?
function getCommandOutput(commandString){
// now how can I implement this function?
// getCommandOutput("ls") should print the terminal output of the shell command "ls"
}
Ответы
Ответ 1
То, как я делаю это в проекте, я сейчас работаю.
var exec = require('child_process').exec;
function execute(command, callback){
exec(command, function(error, stdout, stderr){ callback(stdout); });
};
Пример: извлечение пользователя 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", "") });
});
});
};
Ответ 2
Вы ищете 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);
}
});
Как уже упоминалось Ренато, теперь есть некоторые синхронные пакеты exec, см. sync-exec, что может быть больше того, ищу. Имейте в виду, что node.js спроектирован как однопоточный высокопроизводительный сетевой сервер, поэтому, если вы хотите использовать его для использования, держитесь подальше от файлов sync-exec, если только вы его используете во время запуска или что-то в этом роде.
Ответ 3
Если вы используете узел позже 7.6, и вам не нравится стиль обратного вызова, вы также можете использовать функцию promisify
node-util с помощью async/await
для получения команд оболочки, которые читаются чисто. Вот пример принятого ответа, используя этот метод:
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 }
};
Это также имеет дополнительное преимущество в возврате отклоненного обещания при неудачных командах, которые могут обрабатываться с помощью try/catch
внутри асинхронного кода.
Ответ 4
Благодаря ответу Ренато, я создал действительно простой пример:
const exec = require('child_process').exec
exec("git config --global user.name", (err, stdout, stderr) => console.log(stdout))