Deno.run "echo hello" 怎么会导致找不到这个文件的错误呢?

How does Deno.run "echo hello" cause this file not found error?

在试用 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 is a call to run in js/ops/process.ts, which itself calls sendSync in dispatch_json.ts.

堆栈跟踪表明错误源自 dispatch_json.ts 第 72 行。这只是解开第 67 行收到的 JSON 响应:const resUi8 = core.dispatch(opId, argsUi8, zeroCopy);.

我认为 core.dispatch 一直到 isolate.rs 第 358 行。这就是我迷路的地方。

TLDR:在 Deno 的某个地方发生了这个错误:The system cannot find the file specified. (os error 2) 当我尝试 Deno.run({cmd: ["echo", "hello"]});.

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 的程序时,毫不奇怪,它无法找到该程序所在的位置并在新进程中启动它。

不幸的是,我不知道如何在您的特定实例中解决此问题,因为它非常特定于设置,但我认为这是问题所在。

As :Deno 无法在我的路径中找到名为 echo 的二进制文件。 Google 把我带到了 SO answer telling me echo in Windows is just a command internal to 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);