问题
I have the following script which executes a shell command:
#!/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
is a Buffer
containing stdout
of the child process. As I understand, the way to convert it to a string is to use the .toString()
method, but in my case the string is incomplete. The command I am trying to execute is supposed to produce ~500 KB of data, but buffer.length
is 43741 (that's ~43 KB).
The problem is probably that yarn licenses
output contains some special characters which result in the buffer being incomplete. If I replace the command with printf "%0.s-" {1..500000}
, the buffer is complete.
I am using the latest node version (8.7.0).
Any thoughts/suggestions?
EDIT: Appending | tr "\0" "\n"
to the command increases the buffer size to ~122 KB, so @YaroslavAdmin is definitely looking in the right direction. The result is still incomplete though. How do I make sure all special characters are escaped?
回答1:
Add .toString()
after execSync.
const data = execSync(
'yarn licenses generate-disclaimer --prod',
{ encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }
).toString(); // <<<<<<<<<<<<
来源:https://stackoverflow.com/questions/46818563/buffer-returned-by-child-process-execsync-is-incomplete