child_process.execSync返回的缓冲区不完整

And*_*nko 4 child-process node.js

我有以下脚本执行一个shell命令:

#!/usr/bin/env node

const { execSync } = require('child_process');

try {
    const data = execSync(
        'yarn licenses generate-disclaimer --prod',
        { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
    );

    console.log(data.length);

    return true;
} catch (error) {
    console.error(`Failed to generate disclaimer: ${error.message}`);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

data是子进程的Buffer包含stdout。据我了解,将其转换为字符串的.toString()方法是使用该方法,但就我而言,字符串不完整。我尝试执行的命令应该产生约500 KB的数据,但是它buffer.length是43741(约43 KB)。

问题可能是yarn licenses输出包含一些特殊字符,这会导致缓冲区不完整。如果我将命令替换为printf "%0.s-" {1..500000},则缓冲区已完成。

我正在使用最新的节点版本(8.7.0)。

有什么想法/建议吗?


编辑:追加| tr "\0" "\n"到该命令将缓冲区大小增加到〜122 KB,所以@YaroslavAdmin肯定是朝正确的方向看。结果仍然是不完整的。如何确保所有特殊字符均已转义?

jun*_*var 7

.toString()在execSync之后添加。

const data = execSync(
    'yarn licenses generate-disclaimer --prod',
    { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
).toString(); // <<<<<<<<<<<<
Run Code Online (Sandbox Code Playgroud)

  • 在 Node 16.2.0 中,如果我提供“encoding”,“execSync”会返回一个字符串,因此不需要“.toString”。 (4认同)
  • 当编码已经指定时为什么要使用 toString() ?@junvar (2认同)