Nodejs - child_process execSyn c с выводом java на консоль, а не в буфер - PullRequest
0 голосов
/ 23 марта 2020

У меня есть вызов execSyn c следующим образом:

const { execSync } = require('child_process');
...
console.log('Checking Java version')
let java_version= execSync('java -version').toString();
console.log('Java version:', java_version);
console.log('java_version is empty string:', java_version=="");
if(!java_version)
  throw Error('Java version was empty or null.');

Если я проверяю журналы, я вижу:

Checking Java version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
Java version:
java_version is empty string: true
[ERROR] 'Java version was empty or null.'

Проблема не в том, что команда не при запуске вывод команды не возвращается в виде буфера, как это должно быть. Это идет прямо к выходу Node. Кажется, любая другая команда правильно выводит свой стандартный вывод в Node. Я попытался изменить команду на execSync('echo "testing\n a different command\n\n"').toString();, и все работает как положено, и результат возвращается правильно. Я также пытался перепродать его с помощью execSync('$(java -version)').toString() и execSync('echo $(java -version)').toString(), но не повезло.

Что здесь происходит?

Если это поможет, это на Ubuntu 19: 10

РЕДАКТИРОВАТЬ: Я решил это, запустив execSync('echo $(java -version 2>&1)').tostring(), но я все еще хотел бы знать, почему и как он направлялся в стандартный вывод nodejs и обходил буфер execSyn c. Спасибо.

1 Ответ

0 голосов
/ 23 марта 2020

Потому что execSyn c ('java -version') ничего не вернул. Вы должны использовать его только тогда, когда вы хотите выполнить скрипт, ничего не возвращая. Чтобы получить что-то возвращаемое, вы должны использовать обратный вызов, подобный этому.

execSync('my.bat', (err, stdout, stderr) => {
if (err) {
 console.error(err);
 return;
}
console.log(stdout);
});

, если вы не читали следующую документацию, прочитайте ее. Затем вы поймете много концепции запуска дочернего процесса. введите описание ссылки здесь

...