使用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.1
上v6.3.1
– 我不知道中间。