使用定界符作为 shell 的输入时,为什么 stdin 会关闭

Huc*_*kle 5 shell heredoc

我对此有点困惑

$ bash <<EOF
  read -p 'This will not work' input
EOF
Run Code Online (Sandbox Code Playgroud)

因为

$ cat script
read -p 'This will work fine' input
$ bash script
This will work fine
Run Code Online (Sandbox Code Playgroud)

有什么不同?这似乎是一种标准行为,因为ash行为方式完全相同。


根据迄今为止提供的答案,我怀疑(然后确认)以下方法有效。我认为这实际上是我一直想做的事情,但<()我总是忘记语法的存在。

$ bash <( cat <<EOF
  read -p 'This works' input
EOF
)
Run Code Online (Sandbox Code Playgroud)

iBu*_*Bug 1

作为readbash 内置命令,它继承了bash上面提到的 stdin。在第一种情况下,bash这里有一个标准输入文档(或更专业地,文件描述符0),并且没有任何内容可供read阅读。
read只从 stdin ( fd0) 读取,而在第二种情况下,bash打开另一个文件描述符而不是 stdin 来读取脚本script,这与传递给 的 stdin 不冲突read因此read可以按预期工作。

你可以尝试这个来测试一下。

$ bash << EOF
ls -l /proc/$$/fd
EOF


$猫脚本.sh
ls -l /proc/$$/fd
$bash脚本.sh
如果您比较上面示例的输出,差异就会很明显。