如何在每次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。

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

相關內容