我有以下脚本执行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;
}
data
是包含子进程的Buffer
的stdout
。据我了解,将其转换为字符串的方法是使用.toString()
方法,但就我而言,字符串是不完整的。我尝试执行的命令应该产生约500 KB的数据,但是buffer.length
是43741(约43 KB)。问题可能是
yarn licenses
输出包含一些特殊字符,这会导致缓冲区不完整。如果我将命令替换为printf "%0.s-" {1..500000}
,则缓冲区已完成。我正在使用最新的 Node 版本(8.7.0)。
有什么想法/建议吗?
编辑:向命令添加
| tr "\0" "\n"
会将缓冲区大小增加到〜122 KB,因此@YaroslavAdmin肯定是朝正确的方向看。结果仍然是不完整的。如何确保所有特殊字符均已转义? 最佳答案
在execSync之后添加.toString()
。
const data = execSync(
'yarn licenses generate-disclaimer --prod',
{ encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
).toString(); // <<<<<<<<<<<<