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

Node.js - Доступ к коду выхода и stderr системной команды

Показанный ниже фрагмент кода отлично подходит для получения доступа к стандартной команде системной команды. Есть ли способ изменить этот код, чтобы также получить доступ к коду выхода системной команды и любому выходу, отправленному системной команде в stderr?

#!/usr/bin/node
var child_process = require('child_process');
function systemSync(cmd) {
  return child_process.execSync(cmd).toString();
};
console.log(systemSync('pwd'));
4b9b3361

Ответ 1

Вам не нужно делать это Async. Вы можете сохранить свою функцию execSync.

Оберните его в попытку, и ошибка, переданная в блок catch (e), будет содержать всю информацию, которую вы ищете.

var child_process = require('child_process');

function systemSync(cmd) {
  try {
    return child_process.execSync(cmd).toString();
  } 
  catch (error) {
    error.status;  // Might be 127 in your example.
    error.message; // Holds the message you typically want.
    error.stderr;  // Holds the stderr output. Use '.toString()'.
    error.stdout;  // Holds the stdout output. Use '.toString()'.
  }
};

console.log(systemSync('pwd'));

Если ошибка НЕ выдается, то:

  • статус гарантированно равен 0
  • stdout - это то, что возвращает функция
  • stderr почти наверняка пуст, потому что он был успешным.

В редких случаях исполняемый файл командной строки возвращает stderr и все же выходит со статусом 0 (успех), и вы хотите прочитать его, вам понадобится функция асинхронности.

Ответ 2

Вам понадобится версия async/callback exec. Возвращаются 3 значения. Последние два: stdout и stderr. Кроме того, child_process является эмитентом события. Слушайте событие exit. Первым элементом обратного вызова является код выхода. (Очевидно, из синтаксиса вы захотите использовать node 4.1.1, чтобы получить код ниже, чтобы работать как написано)

const child_process = require("child_process")
function systemSync(cmd){
  child_process.exec(cmd, (err, stdout, stderr) => {
    console.log('stdout is:' + stdout)
    console.log('stderr is:' + stderr)
    console.log('error is:' + err)
  }).on('exit', code => console.log('final exit code is', code))
}

Попробуйте следующее:

`systemSync('pwd')`

`systemSync('notacommand')`

И вы получите:

final exit code is 0
stdout is:/
stderr is:

Далее следуют:

final exit code is 127
stdout is:
stderr is:/bin/sh: 1: notacommand: not found

Ответ 3

Вы также можете использовать child_process.spawnSync(), так как он возвращает намного больше:

return: 
pid <Number> Pid of the child process
output <Array> Array of results from stdio output
stdout <Buffer> | <String> The contents of output[1]
stderr <Buffer> | <String> The contents of output[2]
status <Number> The exit code of the child process
signal <String> The signal used to kill the child process
error <Error> The error object if the child process failed or timed out

Таким образом, код выхода, который вы ищете, будет ret.status.