Мне нужна подсказка после каждой итерации цикла.
НАПРИМЕР: Когда выполняется одна итерация, мне нужно 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