Как соединить два подпроцесса Deno (pipe stdin и stdout)? - PullRequest
2 голосов
/ 29 мая 2020

Судя по документации API , подпроцесс Deno (экземпляр Deno.Process) может получать один из четырех типов stdin, то же самое касается stdout. Однако в документации нет упоминания о том, как направлять выходные данные одного подпроцесса на вход другого. То, что я пытаюсь достичь, похоже на конвейер basi c UNIX (oneProcess | another), а затем прочитайте вывод второго процесса в конвейере. При простом запуске

const someProcess = Deno.run({
  cmd: ["oneProcess firstParameter | another 2ndParameter"]
});

происходит сбой с ошибкой:

error: Uncaught NotFound: нет такого файла или каталога (ошибка ОС 2)

поскольку ожидается, что первый аргумент (строка) будет исполняемым файлом.

Как можно достичь этого - Deno тогда, нужно ли нам, возможно, установить "piped" как выход и вход для подпроцессов (соответственно), а затем вручную читать и записывать данные из одного в другой?

1 Ответ

3 голосов
/ 29 мая 2020

Вы получаете NotFound: no such file or directory, потому что значение, переданное в cmd, должно быть путем к двоичному файлу.

первый элемент должен быть путем к двоичному

И onProcess | another не является двоичным.


Чтобы использовать канал unix |, вы можете запустить bash и затем записать в stdin.

const p = Deno.run({
  cmd: ["bash"],
  stdout: "piped",
  stdin: "piped",
  stdout: "piped"
});

const encoder = new TextEncoder();
const decoder = new TextDecoder();

const command = "echo -n yes | md5sum";
await p.stdin.write(encoder.encode(command));

await p.stdin.close();
const output = await p.output()
p.close();

console.log(decoder.decode(output)); // a6105c0a611b41b08f1209506350279e
...