使用child_process.execSync,但保持输出在控制台

我想使用在execSync 0.12中添加的execSync方法,但仍然在控制台窗口中输出我运行Node脚本的输出。

例如,如果我运行一个具有以下行的NodeJS脚本,我希望在控制台中看到rsync命令“live”的完整输出:

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

我明白, execSync返回命令的输出,我可以执行后,打印到控制台,但这样我没有“活”输出…

如果这是你想要的,你可以把父母的stdio传递给subprocess :

 require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"', {stdio:[0,1,2]}); 

除非您按照接受的答案所示redirectstdout和stderr,否则execSync或spawnSync无法实现。 如果不redirectstdout和stderr,那么命令完成时,这些命令只会返回stdout和stderr。

要做到这一点,而不redirectstdout和stderr,你将需要使用spawn来做到这一点,但它是非常简单的:

 var spawn = require('child_process').spawn; //kick off process var child = spawn('ls', ['-latkR', '/']); //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); }); 

我使用了recursion列出文件的ls命令,以便您可以快速进行testing。 Spawn将第一个参数作为你要运行的可执行文件的名字,第二个参数需要一个string数组来表示你想传递给该可执行文件的每个参数。

但是,如果您使用execSync进行设置,并且出于某种原因无法redirectstdout或stderr,则可以打开另一个terminal(如xterm)并将其传递给像下面这样的命令:

 var execSync = require('child_process').execSync; execSync("xterm -title RecursiveFileListing -e ls -latkR /"); 

这将允许你看到你的命令在新的terminal上做了什么,但仍然有同步呼叫。

你可以简单地使用.toString()

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

这已经在Node v8.5.0上testing过了,我不确定以前的版本。 根据@etov ,它不能在v6.3.1v6.3.1 – 我不知道中间。