如何在每次while循环迭代后得到提示?

如何在每次while循环迭代后得到提示?

我想要在每次循环迭代后有一个提示。

例如:当执行一次迭代时,我需要Press Enter to continue在第二次迭代后再次,在第三次迭代后再次,依此类推。

我正在使用read -p " Press enter to continue "(但这被跳过)。

while read line

do

echo "$line" logs""

echo " "

echo "`tail -100 Domain1."$line"`"

read -p "Press enter to continue"

done<input.txt

答案1

你的read -p循环内部正在被“跳过”(不是真的),因为它正在从input.txt.默认情况下,循环内的所有命令都会从循环继承其标准输入流,这连接到input.txt

相反,您必须read line从新的输入文件描述符进行读取,并通过该描述符传递文件的内容:

while IFS= read -r line <&3; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

在这里,我们使用文件描述符 3(标准文件描述符之后的下一个空闲且可用的文件描述符)并将其连接到输入文件。然后我们read line明确要求读取文件描述符,而不是来自其标准输入(文件描述符 0)。这使得标准输入空闲,并且将read -p像往常一样从中读取。

或者,您可以从上面的循环中交换输入文件描述符:

while IFS= read -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue' <&3
done 3<&0 <input.txt

现在,read line通过继承自循环的普通标准输入从文件读取read -p文件描述符 3。在从文件重定向标准输入之前,文件描述符 3 作为标准输入的副本打开。

bash壳里,

read <&3

也可以写成

read -u 3

因此,“最干净”的解决方案(在包含最少量的文件描述符杂耍语法的意义上)可能是这样的

while IFS= read -u 3 -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

相关内容