Ответ 1
Вы можете передать stdio родителя дочернему процессу, если это то, что вы хотите:
require('child_process').execSync(
'rsync -avAXz --info=progress2 "/src" "/dest"',
{stdio: 'inherit'}
);
Я хотел бы использовать метод execSync
, который был добавлен в NodeJS 0.12, но все еще имеет выход в окне консоли, из которого я запускал Node script.
например. если я запустил NodeJS script, который имеет следующую строку, я бы хотел увидеть полный вывод команды rsync "live" внутри консоли:
require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');
Я понимаю, что execSync
возвращает вывод команды и что я могу ее распечатать на консоль после выполнения, но таким образом у меня нет "живого" выхода...
Вы можете передать stdio родителя дочернему процессу, если это то, что вы хотите:
require('child_process').execSync(
'rsync -avAXz --info=progress2 "/src" "/dest"',
{stdio: 'inherit'}
);
Если вы не перенаправляете 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);
Это было протестировано на Node v8.5.0
, я не уверен в предыдущих версиях. Согласно @etov, он не работает на v6.3.1
- я не уверен в промежутках между ними.