使用child_process.execSync但在控制台

时间:2015-05-08 23:23:23

标签: node.js child-process

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

E.g。如果我运行一个具有以下行的NodeJS脚本,我希望看到rsync命令的完整输出" live"在控制台内:

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

我知道execSync会返回命令的输出,并且我可以在执行后将其打印到控制台,但这样我就没有"生活"输出...

4 个答案:

答案 0 :(得分:243)

如果你想要的话,你可以传递parent´s stdio to the child process

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

答案 1 :(得分:15)

您只需使用 public voidfilter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); mListModel.clear(); if (charText.length() == 0) { mListModel.addAll(arraylist); } else { ArrayList<ListModel> list=new ArrayList<>(); for (ListModel wp : arraylist) { if (wp.getalbumName().toLowerCase(Locale.getDefault()).startsWith(charText)) { mListModel.add(wp); } } } notifyDataSetChanged(); }

.toString()

这已在Node var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString(); console.log(result); 上测试过,我不确定以前的版本。根据{{​​3}},它不适用于v8.5.0 - 我不确定介于两者之间。

答案 2 :(得分:14)

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

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

答案 3 :(得分:0)

简单地:

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

enter image description here

enter image description here

命令成功运行时: enter image description here