Bash: читання вводу всередині циклу читання не працює


14

Читання введення протягом певного циклу читання, здається, не працює

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

виконання не призупиняється, як би це було прочитане поза циклом. Чому це? Чи існує рішення щодо введення читання в межах певного циклу читання?

Відповіді:


15

Проблема в тому, що read lineі read responseочікує (і отримує) даних від них stdin.
Це питання на SO пояснює деякі з них посиланням на ще більше інформації.

tl; dr
Прийнята відповідь пропонує:

Прочитайте з керуючого термінального пристрою: read input </dev/tty


16

нехай внутрішня команда читання використовує stdin, а використовуйте інший дескриптор файлу для циклу while

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

1

Найфл має це правильно. Однак, коли ви використовуєте кілька терміналів, вам потрібно бути конкретними.

Для тих, хто з Google виходить, вітаємо з пошуком цієї сторінки. Якщо вам потрібно зробити будь-який призначений для користувача введення під час під час зчитування циклу (це включає в себе rm -i, readабо що - небудь ще), ви можете вказати , яку вхідну трубу для використання.

Ось фрагмент цього рішення, який я використав:

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

1

Дякую Ніфле! А також завдяки bgStack. Після пошуків годин я нарешті отримав відповідь! Чудовий !! Я використовував "echo $ (tty)" для виявлення мого термінального шляху, або ви просто сприймаєте його як змінну. Для мене це був інший випадок використання. Ви читали файл і хотіли б підтвердити виконання. Можливо, наведений нижче приклад допомагає комусь ще.

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

У моєму випадку я мав whileчитання з труби ... і потім я використовував перенаправлення , щоб читати зі стандартного вводу: read something < %terminal.
eftshift0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.