Как получить подсказку после каждой итерации цикла 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

Связанный контент