![依赖于标准输入的命令无法正常工作](https://linux22.com/image/1398752/%E4%BE%9D%E8%B5%96%E4%BA%8E%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E7%9A%84%E5%91%BD%E4%BB%A4%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
这是我的代码
bash << EOF
read
EOF
在这里,读命令失败,无法从标准输入读取
和这里
bash << EOF
read
ls
ls
EOF
仅次于ls被执行(第一个ls已重定向至读作为输入?
有人能告诉我我做错了什么吗?所有需要从 std 输入输入的命令都失败了
答案1
语法<<word
("Here documents") 重定向标准输入。因此,您所做的就是启动一个 bash,其标准输入被重定向到“here document”。当该 bash 启动子进程(或执行内置命令)时,这些子进程会从 bash 继承标准输入,因此它们也会从 here document 读取数据。(here document 并没有什么特别神秘之处。一种实现可能性是将 here document 复制到临时文件中,然后将标准输入重定向到该文件。Bash 可能会在某些情况下这样做。)
重定向标准输入并不是让 bash 执行文件的唯一方法。您只需在命令行上为 bash 提供文件的名称即可。同样,您不需要真实的文件即可实现此功能;您可以使用进程替换,如下所示:
bash <(echo '
read -p "Say it: " A
echo You said $A
')
由于这不会重定向标准输入,因此read
将从标准输入读取,而不是从输入到 bash 的命令读取。
但要注意引用问题:在输入这个简单的例子时,他们两次咬了我一口。