代码之家  ›  专栏  ›  技术社区  ›  user1763684

Deno:如何在子进程完成之前运行shell命令并读取输出?

  •  2
  • user1763684  · 技术社区  · 2 年前

    如何启动子进程(通过shell)并在不返回子进程之前读取其输出?

    我用以下命令通过Mac终端启动Google Chrome: /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir') 这很有效,但在我完成浏览器操作之前,这个过程不会结束/返回。然而,一旦推出,它就会将以下内容打印到控制台: “DevTools正在侦听ws://127.0.0.1:9222/devtoolsbrowser/d43342be-66bc-41d4-b591-a7ee22d1c528”

    我需要刮一下。我可以在Deno(版本1.36.3)中成功启动此功能,使用:

    const myCMD = `/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome`;
    
    const p = Deno.run({
      cmd: [
        myCMD,
        "--remote-debugging-port=9222",
        "--no-first-run",
        "--no-default-browser-check",
        "--user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')",
      ],
      stdout: "piped",
      stderr: "piped",
      stdin: "piped",
    });
    
    await p.stdin.write(new TextEncoder().encode("Coming from stdin\n"));
    await p.status();
    
    

    但我无法读取所需的值,因为过程没有完成,因此输出永远不会返回。有没有一种方法可以在子进程返回之前读取它向控制台写入的内容?

    FYI。。。我参考了以下文章: https://medium.com/deno-the-complete-reference/run-shell-commands-in-deno-26c3e9b72e03

    1 回复  |  直到 2 年前
        1
  •  2
  •   Marcos Casagrande    2 年前

    你需要阅读 p.stdout p.stderr ,两者都是 FsFile 这样你就可以使用 .readable 访问 ReadableStream 或使用 .read 方法 FsFile

    const myCMD = `/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome`;
    
    const p = Deno.run({
      cmd: [
        myCMD,
        "--remote-debugging-port=9222",
        "--no-first-run",
        "--no-default-browser-check",
        "--user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir')",
      ],
      stdout: "piped",
      stderr: "piped",
      stdin: "piped",
    });
    
    (async() => {
       for await(const chunk of p.stdout.readable) {
           console.log(chunk, new TextDecoder().decode(chunk))
       }
    })();
    
    (async() => {
        for await(const chunk of p.stderr.readable) {
            console.log(chunk, new TextDecoder().decode(chunk))
        }
    })();
    
    await p.stdin.write(new TextEncoder().encode("Coming from stdin\n"));
    await p.status();
    

    现在您将看到该过程的输出。