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);
在试用 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 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);