Answers:
require('child_process').execSync(
'rsync -avAXz --info=progress2 "/src" "/dest"',
{stdio: 'inherit'}
);
options.stdio
文档链接:nodejs.org/api/child_process.html#child_process_options_stdio
{stdio:'inherit'}
,您必须添加.toString(),然后手动调用console.log并显示结果。另外,它甚至不能满足看到“实时”命令输出的问题要求。我不认为它“简单得多”,实际上我认为它并不简单。
您可以简单地使用.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
-我不确定它们之间。
.execSync()
引发了一个Error
实例。
除非按照接受的答案建议重定向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 /");
这将使您看到命令在新终端中正在执行的操作,但仍具有同步调用。