Подтвердить что ты не робот

Выполнить и получить вывод команды оболочки в 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"
}
4b9b3361

Ответ 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))