¿Cómo obtener un mensaje después de cada iteración del bucle while?

¿Cómo obtener un mensaje después de cada iteración del bucle while?

Quiero un mensaje después de cada iteración del bucle.

POR EJEMPLO: Cuando se realiza una iteración, necesito Press Enter to continuey luego nuevamente después de la segunda iteración, nuevamente después de la tercera y así sucesivamente.

Estoy usando read -p " Press enter to continue "(pero esto se omite).

while read line

do

echo "$line" logs""

echo " "

echo "`tail -100 Domain1."$line"`"

read -p "Press enter to continue"

done<input.txt

Respuesta1

El read -pinterior del bucle se "salta" (en realidad no) porque está leyendo desde input.txt. Todos los comandos dentro del bucle heredarán su flujo de entrada estándar del bucle de forma predeterminada, y esto está conectado ainput.txt

En su lugar, tendrá que realizar la read linelectura desde un nuevo descriptor de archivo de entrada y entregar el contenido del archivo sobre él:

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

Aquí usamos el descriptor de archivo 3 (el siguiente descriptor de archivo gratuito y disponible después de los estándar) y lo conectamos al archivo de entrada. Luego pedimos read lineexplícitamente leer deesodescriptor de archivo, en lugar de desde su entrada estándar (descriptor de archivo 0). Esto deja la entrada estándar libre y la read -pleerá como de costumbre.

Alternativamente, puede intercambiar los descriptores del archivo de entrada desde el bucle anterior:

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

Ahora las read linelecturas del archivo a través de la entrada estándar ordinaria heredada del bucle mientras read -pse lee desde el descriptor de archivo 3. El descriptor de archivo 3 se abre como una copia de la entrada estándar antes de que la entrada estándar se redirija desde el archivo.

En el bashcaparazón,

read <&3

también podría escribirse

read -u 3

Entonces, la solución "más limpia" (en el sentido de contener la menor cantidad de sintaxis de malabarismo con descriptores de archivos) puede ser algo como

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

información relacionada