![]() |
坏坏的金针菇 · 使用DBeaver通过Windows身份验证 ...· 11 月前 · |
![]() |
含蓄的汽水 · android ...· 1 年前 · |
![]() |
踏实的鸡蛋面 · 内存使用量接近Google ...· 1 年前 · |
![]() |
飞奔的可乐 · Python更改IDLE默认保存路径_win ...· 1 年前 · |
![]() |
无邪的橙子 · 【精选】使用python的geopands和 ...· 1 年前 · |
我想使用在NodeJS 0.12中添加的
execSync
方法,但是仍然在控制台窗口中保存我从中运行节点脚本的输出。
例如,如果我运行一个包含以下行的NodeJS脚本,我希望在控制台中看到rsync命令"live“的完整输出:
require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');
我知道
execSync
返回命令的输出,并且我可以在执行后将其打印到控制台,但这样我就没有“实时”输出……
除非您像公认的答案所建议的那样重定向标准输出和标准错误,否则这对于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,并且由于某些原因无法重定向标准输出或标准错误,则可以打开另一个终端,如xterm,并向其传递如下命令:
var execSync = require('child_process').execSync;
execSync("xterm -title RecursiveFileListing -e ls -latkR /");
这将允许您看到您的命令在新终端中做了什么,但仍然具有同步调用。
如果这是你想要的,你可以传递 parent´s stdio to the child process :
require('child_process').execSync(
'rsync -avAXz --info=progress2 "/src" "/dest"',
{stdio: 'inherit'}
);
简单地说:
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();