我试图在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"
只是一个任意的名称/变量。
请参见帮助阅读