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

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

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

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


除非你重定向stdout和stderr作为接受的答案建议,这是不可能的execSync或产卵同步。没有重定向标准输出和标准错误,这些命令只返回标准输出和标准错误时,命令完成。

要在不重定向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 /");

这将允许您看到您的命令在新终端中做什么,但仍然有同步调用。


如果你想的话,你可以把父进程的stdio传递给子进程:

require('child_process').execSync(
    'rsync -avAXz --info=progress2 "/src" "/dest"',
    {stdio: 'inherit'}
);

您可以简单地使用. tostring()。

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

编辑:回顾这一点,我意识到它实际上并没有回答特定的问题,因为它没有向您“实时”显示输出-只有在命令运行完成后才显示输出。

然而,我把这个答案留在这里,因为我知道相当多的人遇到这个问题只是为了寻找如何在执行命令后打印命令的结果。


简单:

 try {
    const cmd = 'git rev-parse --is-inside-work-tree';
    execSync(cmd).toString();
 } catch (error) {
    console.log(`Status Code: ${error.status} with '${error.message}'`;
 }

裁判:https://stackoverflow.com/a/43077917/104085

// nodejs
var execSync = require('child_process').execSync;

// typescript
const { execSync } = require("child_process");

 try {
    const cmd = 'git rev-parse --is-inside-work-tree';
    execSync(cmd).toString();
 } catch (error) {
    error.status;  // 0 : successful exit, but here in exception it has to be greater than 0
    error.message; // Holds the message you typically want.
    error.stderr;  // Holds the stderr output. Use `.toString()`.
    error.stdout;  // Holds the stdout output. Use `.toString()`.
 }

当命令运行成功时:


在选项中添加{"encoding": "utf8"}。

execSync(`pwd`, {
  encoding: "utf8"
})