我在 bash 脚本中使用以下语句来迭代 find 的结果:
find ./ -type f \( -iname \*.mkv -o -iname \*.mp4 \) | while read line; do
现在的问题是我无法在此循环中使用“read”要求用户输入,因为它会给我查找结果中的下一行。
read mainmenuinput
会给我下一个文件名,而不是等待用户输入。
我该如何解决这个问题?
谢谢雷风
答案1
find
如果您使用从进程替换到循环的重定向,则可以对结果使用不同的文件描述符:
# this reads from fd 3
while IFS= read -r line <&3; do
# this reads from fd 0 (stdin)
read -p "Enter your input" main_menu_input
# .. do stuff
done 3< <(
find ...
)
这会稍微损害可读性,因为 find 命令显示在底部,但它为您提供了文件描述符的最大灵活性。另外,while 循环是不是由于管道的原因,它在子 shell 中运行,因此,如果您在循环后面的代码中所依赖的 while 循环中设置变量,那么现在就可以了。