我不是在寻找该问题的变通方法或解决方案。我很好,它在bash
. 我只是不明白为什么它不起作用。
我正在寻找一个深入的答案,为什么以下脚本不起作用。以前所有的互联网搜索结果,包括来自 unix.stackexchange.com 的帖子,都无法真正完全清除这一点。它与read
读取stdin
哪个不起作用有关,因为stdin
已经通过管道cat
喂食“采取”(?)?bash
示例 bash 脚本test.sh
:
echo "Please say name:"
read NAME
echo "Hello $NAME"
方法 1 调用脚本bash test.sh
:
$ bash test.sh
Please say name:
XYZ
Hello XYZ
$
方法 2 通过管道运行脚本到bash
:
$ cat test.sh | bash
Please say name:
$
所以脚本立即返回提示,无需等待输入甚至打印第二行。
您确实从标准输入读取了
read
,但您读取的是标准输入的下一行 - 即echo "Hello $NAME"
. 读完那行之后,没有更多的输入,因此没有更多的命令要执行,脚本就结束了。只有一个标准输入流,您正尝试将它用于代码和数据。这与交互式
bash
会话如何从您的键入中读取命令、read
响应以及您运行的任何其他命令想要使用标准输入的方式相同。如果我们在脚本末尾添加额外的一行,您会看到这种情况:
这既提供了进一步的命令来查看脚本继续执行,并向我们展示了读入的内容
NAME
:您可以看到该变量逐字保存了脚本文件中写入的内容 - 没有发生变量插值、执行或扩展。
如果你想
read
从终端,这是可能的。可能工作的最简单方法是从标准输出而不是标准输入(!)读取,这可能连接到 TTY:这将等待我输入一些内容,然后继续执行程序的其余部分。您也可以使用
/dev/tty
或$(tty)
。