diff --git a/js/process.ts b/js/process.ts index bf75b6b32d..8ce83477a5 100644 --- a/js/process.ts +++ b/js/process.ts @@ -83,7 +83,7 @@ export class Process { } /** Buffer the stdout and return it as Uint8Array after EOF. - * You must have set stdout to "piped" in when creating the process. + * You must set stdout to "piped" when creating the process. * This calls close() on stdout after its done. */ async output(): Promise<Uint8Array> { @@ -97,6 +97,21 @@ export class Process { } } + /** Buffer the stderr and return it as Uint8Array after EOF. + * You must set stderr to "piped" when creating the process. + * This calls close() on stderr after its done. + */ + async stderrOutput(): Promise<Uint8Array> { + if (!this.stderr) { + throw new Error("Process.stderrOutput: stderr is undefined"); + } + try { + return await readAll(this.stderr); + } finally { + this.stderr.close(); + } + } + close(): void { close(this.rid); } diff --git a/js/process_test.ts b/js/process_test.ts index b442f0092a..051841ffeb 100644 --- a/js/process_test.ts +++ b/js/process_test.ts @@ -187,6 +187,17 @@ testPerm({ run: true }, async function runOutput() { p.close(); }); +testPerm({ run: true }, async function runStderrOutput() { + const p = run({ + args: ["python", "-c", "import sys; sys.stderr.write('error')"], + stderr: "piped" + }); + const error = await p.stderrOutput(); + const s = new TextDecoder().decode(error); + assertEquals(s, "error"); + p.close(); +}); + testPerm({ run: true }, async function runEnv() { const p = run({ args: [ diff --git a/website/manual.md b/website/manual.md index f665d192d8..738d841856 100644 --- a/website/manual.md +++ b/website/manual.md @@ -398,8 +398,13 @@ async function main() { const { code } = await p.status(); - const rawOutput = await p.output(); - Deno.stdout.write(rawOutput); + if (code === 0) { + const rawOutput = await p.output(); + Deno.stdout.write(rawOutput); + } else { + const rawError = await p.stderrOutput(); + Deno.stdout.write(rawError); + } Deno.exit(code); }