我想在每次循環迭代後有一個提示。
例如:當執行一次迭代時,我需要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