我想要在每次循环迭代后有一个提示。
例如:当执行一次迭代时,我需要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