Используйте дочерний процесс.execSync, но сохранить вывод в консоли
Я хотел бы использовать execSync метод, который был добавлен в NodeJS 0.12, но все еще имеет выход в окне консоли, из которого я запустил скрипт узла.
например, если я запускаю скрипт NodeJS, который имеет следующую строку, я хотел бы видеть полный вывод команды rsync "live" внутри консоли:
require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');
Я понимаю, что execSync возвращает вывод команды и что я мог бы распечатать это на консоль после выполнения, но таким образом у меня нет " live" выход...
3 ответов:
вы можете пройти родители stdio к дочернему процессу если это то, что вы хотите:
require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"', {stdio:[0,1,2]});
Если вы не перенаправляете stdout и stderr, как предполагает принятый ответ, это невозможно с помощью execSync или spawnSync. Без перенаправления stdout и stderr эти команды возвращают только stdout и stderr, когда команда завершена.
чтобы сделать это без перенаправления stdout и stderr, вам нужно будет использовать spawn для этого, но это довольно прямолинейно:
var spawn = require('child_process').spawn; //kick off process of listing files var child = spawn('ls', ['-l', '/']); //spit stdout to screen child.stdout.on('data', function (data) { process.stdout.write(data.toString()); }); //spit stderr to screen child.stderr.on('data', function (data) { process.stdout.write(data.toString()); }); child.on('close', function (code) { console.log("Finished with code " + code); });я использовал команду ls, которая рекурсивно перечисляет файлы, чтобы вы могли проверить ее быстро. Spawn принимает в качестве первого аргумента имя исполняемого файла, который вы пытаетесь запустить, и в качестве второго аргумента он принимает массив строк, представляющих каждый параметр, который вы хотите передать в этот исполняемый файл.
однако, если вы настроены на использование execSync и по какой-то причине не можете перенаправить stdout или stderr, вы можете открыть другой терминал, например xterm, и передать ему команду:
var execSync = require('child_process').execSync; execSync("xterm -title RecursiveFileListing -e ls -latkR /");Это позволит вам увидеть, что ваша команда делает в новый терминал а еще есть синхронный вызов.
вы можете просто использовать
.toString().var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString(); console.log(result);Это было проверено на узле
v8.5.0, Я не уверен в предыдущих версиях. Согласно @etov, это не работает наv6.3.1- Я не уверен, что между ними.
Comments