使用child_process.execSync,但将输出保留在控制台中

问题描述 投票:0回答:5

我想使用 NodeJS 0.12 中添加的

execSync
方法,但在我运行 Node 脚本的控制台窗口中仍然有输出。

例如,如果我运行一个包含以下行的 NodeJS 脚本,我希望在控制台中看到

rsync
命令“live”的完整输出:

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

我知道

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

node.js child-process
5个回答
549
投票

如果您想要的话,您可以将父级的stdio传递给子进程

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

53
投票

您可以简单地使用

.toString()

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

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

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


24
投票

除非您按照接受的答案建议重定向 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 /");

这将允许您查看命令在新终端中正在执行的操作,但仍然具有同步调用。


9
投票

简单地说:

 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()`.
 }

命令运行成功时:


4
投票

在选项中添加

{"encoding": "utf8"}

execSync(`pwd`, {
  encoding: "utf8"
})
© www.soinside.com 2019 - 2024. All rights reserved.