【发布时间】:2021-07-19 02:28:05
【问题描述】:
假设我有这个超级有用且高级的 bash 脚本:
#!/usr/bin/env bash
echo What is your name?
read name
echo What is your age?
read age
当我尝试使用这样的简单脚本从 Deno 运行它时:
const process = Deno.run({
cmd: [`./bash.sh`],
stdin: "piped",
stdout: "piped",
});
const decoder = new TextDecoder();
const output = await process.output()
const parsed = decoder.decode(output);
console.log(parsed);
它什么也不返回,但是如果我将 Deno 脚本简化为 bash 脚本的第一行,它会返回输出就好了
const process = Deno.run({
cmd: [`echo`, `What is your name?`],
stdin: "piped",
stdout: "piped",
});
const decoder = new TextDecoder();
const output = await process.output()
const parsed = decoder.decode(output);
console.log(parsed);
这是为什么?我假设由于 bash 文件的开头和单行命令都以 echo 开头,所以它会两次返回相同的结果
【问题讨论】:
-
您的代码在哪里向进程的标准输入(它期望从中读取的管道)提供任何内容?如果没有标准输入,
reads 将永远不会完成。 (如果您至少关闭标准输入,它们会立即失败而不是挂起)。 -
顺便说一句,请注意,不能保证没有 shebang 的脚本完全可以运行。如果您希望它被视为 bash 脚本(而不是
sh脚本),那么 shebang 应该是#!/usr/bin/env bash或#!/usr/bin/bash等。 (典型的 shell 具有后备行为,他们假设没有 shebang 的脚本是某种 shell 脚本,但是当某些东西在没有 shell 的情况下运行时,该后备不可用,因为操作系统的execve系统调用仅适用于操作系统内核的东西知道如何执行)。 -
@CharlesDuffy 我认为
echo可以用于输入标准输入。我的 bash 脚本中有 shebang 但忘记复制和粘贴它,我已经更新了代码 :) -
echo转到脚本的标准输出。这里没有任何东西将它循环回脚本自己的标准输入。 (如果程序的标准输入和标准输出自动相互连接,那将......不是很有用;通常,脚本的目标是从位置 A 获取输入并将输出发送到位置 B;如果有任何东西发送到位置-B 回到地方-A,实际上无法从脚本外部获取输入,也无法将输出发送到脚本外部)。 -
让我们备份一下:您希望
reads 从哪里获得输入?当你说stdin: "piped"时,你是在告诉 Deno,你将负责编写输入该输入的 javascript 代码。如果您不想这样做,则不应传递该参数。