Quiero un mensaje después de cada iteración del bucle.
POR EJEMPLO: Cuando se realiza una iteración, necesito Press Enter to continue
y 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 -p
interior 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 line
lectura 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 line
explí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 -p
leerá 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 line
lecturas del archivo a través de la entrada estándar ordinaria heredada del bucle mientras read -p
se 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 bash
caparazó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