Как Deno.run "echo hello" вызывает ошибку "Этот файл не найден"? - PullRequest
1 голос
/ 26 мая 2020

Пробуя стандартную библиотеку Deno, я столкнулся с проблемой Deno.run - функцией для создания нового подпроцесса.

Этот пример представлен в документации:

const p = Deno.run({
    cmd: ["echo", "hello"],
});

Запустив это с использованием разрешения --allow-run, я получаю следующую ошибку:

error: Uncaught NotFound: The system cannot find the file specified. (os error 2)
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at Object.run ($deno$/ops/process.ts:41:10)
    at Object.run ($deno$/process.ts:118:15)
    at file:///C:/Users/.../gitgraph-deno/gitgraph.ts:1:16

js / process.ts: 118: 15 - это вызов run в js / ops / process.ts , который сам вызывает sendSync in dispatch_ json .ts .

В stacktrace говорится, что ошибка возникает из dispatch_ json .ts строка 72. Это просто разворачивает ответ JSON, полученный в строке 67: const resUi8 = core.dispatch(opId, argsUi8, zeroCopy);.

Я думаю, что core.dispatch идет полностью до isolate.rs строка 358. Вот где я заблудился.

TL; DR : где-то под капотом Deno возникает эта ошибка: The system cannot find the file specified. (os error 2), когда я пытаюсь Deno.run({cmd: ["echo", "hello"]});.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Как опубликовано ниже Эндрю Дибблом : Deno не может найти двоичный файл с именем echo на моем пути. Google привел меня к SO, ответ сказал мне, что echo в Windows - это просто команда , внутренняя для CMD . Это не двоичный файл.

cmd /c позволяет вызывать внутренние и внешние команды CMD.exe.

Принимая это во внимание, я исправил свою проблему, используя:

Deno.run({cmd: ["cmd", "/c", "echo", "hello"]});

Вместо:

Deno.run({cmd: ["echo", "hello"]});


А вот пример для чтения вывода:

const p = Deno.run({cmd: ["cmd", "/c", "echo", "hello"], stdout: "piped"});
const output = new TextDecoder('utf-8').decode(await p.output());
console.log(output);
0 голосов
/ 26 мая 2020

Deno не может найти двоичный файл с именем echo на вашем пути:

$ deno
Deno 1.0.0
exit using ctrl+d or close()
> Deno.run({
    cmd: ["echo", "hello"],
hello
Process { rid: 4, pid: 24264 }

На моей машине Linux вышеуказанное работает нормально, потому что у меня есть программа, доступная на моем пути через имя echo.

Однако у меня нет программы с именем foo:

> Deno.run({
    cmd: ["foo", "hello"],
});
Uncaught NotFound: No such file or directory (os error 2)
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at Object.run ($deno$/ops/process.ts:45:10)
    at Object.run ($deno$/process.ts:118:15)
    at <unknown>:1:6
    at evaluate ($deno$/repl.ts:45:34)
    at Object.replLoop ($deno$/repl.ts:136:13)

Поэтому, когда я говорю Deno запустить программу с именем foo, неудивительно, что невозможно найти, где находится эта программа, и запустить ее в новом процессе.

К сожалению, я не знаю, как исправить это в вашем конкретном случае, потому что это очень специфично для настройки c , но я считаю, что проблема именно в этом.

...