首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么stdin在使用heredoc作为shell的输入时关闭?

为什么stdin在使用heredoc作为shell的输入时关闭?
EN

Stack Overflow用户
提问于 2016-10-30 06:34:12
回答 3查看 652关注 0票数 4

我被这个弄糊涂了

代码语言:javascript
复制
$ bash <<EOF
  read -p 'This will not work' input
EOF

因为

代码语言:javascript
复制
$ cat script
read -p 'This will work fine' input
$ bash script
This will work fine

有什么关系呢?这似乎是一种标准行为,因为ash的行为完全相同。

根据到目前为止所提供的答案,我怀疑(然后确认)以下的作品。我认为这实际上是我一直想要做的,但<()语法始终是我忘记存在的语法。

代码语言:javascript
复制
$ bash <( cat <<EOF
  read -p 'This works' input
EOF
)
EN

回答 3

Stack Overflow用户

发布于 2016-10-30 08:08:50

每个进程不能同时拥有多个stdin,因此作为输入传递给bash的此处文档不能包含read -p

使用bash script,运行的script是Bash的一个子进程,没有并发的stdinread,因此它将按预期工作。

票数 2
EN

Stack Overflow用户

发布于 2016-10-30 13:18:56

在这两种情况下,read命令从执行它的bash进程继承其标准输入。

在第一个示例中,这意味着实际包含read命令的first文档。取决于bash已经读取了多少文档(通常是所有文档),read没有什么可读取的,因此它以非零退出状态退出。

在第二个示例中,bash在不同的文件描述符上打开命名的文件。read仍然从bash进程继承它的标准输入,但是这次bash根本没有读取它,所以read命令获得了下一个可用的行。这里的标准输入是终端,所以read会阻塞,直到用户输入一行。

票数 2
EN

Stack Overflow用户

发布于 2019-02-12 13:31:03

最简单的解决方案是将交互命令写入临时文件,然后从临时文件中获取:

代码语言:javascript
复制
cat <<'_EOF_' >/tmp/$$.sh
read -p 'This is an interactive command, please enter a string: ' STRING
_EOF_
# Command in temporary file get executed here
source /tmp/$$.sh
echo "STRING= '$STRING'"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40326598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档