Используйте child_process.execSync, но сохраняйте вывод в консоли

Я хотел бы использовать метод execSync, который был добавлен в NodeJS 0.12, но все еще имеет выход в окне консоли, из которого я запускал Node script.

например. если я запустил NodeJS script, который имеет следующую строку, я бы хотел увидеть полный вывод команды rsync "live" внутри консоли:

require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');

Я понимаю, что execSync возвращает вывод команды и что я могу ее распечатать на консоль после выполнения, но таким образом у меня нет "живого" выхода...

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

Это позволит вам увидеть, что делает ваша команда в новом терминале, но все еще имеет синхронный вызов.

Ответ 3

Вы можете просто использовать .toString().

var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);

Это было протестировано на Node v8.5.0, я не уверен в предыдущих версиях. Согласно @etov, он не работает на v6.3.1 - я не уверен в промежутках между ними.