read -t没有暂停bash中的while循环



我试图在bash中创建一个简单的循环,列出目录中的所有文件,一个接一个。

我想在进入下一个之前先点击Enter。我认为添加read会使循环暂停。但它并没有暂停。它一次列出了所有的文件。下面是我使用的命令

find . -type f | while read -r line; do echo "$line"; read -t 1; done`

扩展@anubhava的回答,在哪里使用其他文件描述符并不重要。您可以使用它读取来自find进程的输入,并接受用户输入以提示stdin(fd0)上的下一个文件。关键是必须使用两个不同的描述符,一个用于从find输入文件名,另一个用于从用户击键获取输入。例如,您还可以这样做:

while read -u 4 -r line; do 
echo "$line"
read -n1 -t2 c
done 4< <(find . -type f)

在功能上是等价的,除了这里,用find替换进程的结果在fd4上被重定向,而用户可以在stdin上提供输入,或者在2秒超时后,下一个文件将自动显示。

你可以这样做:

# redirect fd=3 from 0
exec 3<&0
while IFS= read -rd '' line; do
echo "$line"
# read from fd=3 and wait for 1 sec
read -u 3 -t 1
done < <(find . -type f -print0)
# close fd=3
exec 3<&-

我想在进入下一个之前按回车键。我认为添加read会使循环暂停

尝试ProcSub并对第一个read使用不同的FD。注意,内部的read就在do之后。

while read -ru9 line; do read -p "$line"; done 9< <(find . -type f)

来自read的-u标志意味着它将使用给定的文件描述符,在本例中是9

如果你的bash是新的,你可以用varname作为FD

之类的
while read -ru "$fd" line; do read -p "$line"; done {fd}< <(find . -type f)

不为FD硬编码固定值。其中"$fd"只是一个任意的名称/变量。

请参见帮助阅读

最新更新