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'));
Ответы
Ответ 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.