Я хочу использовать read cmd через некоторое время, чтобы читать строку для каждой строки из файла, но у меня проблема в строке 4 в этом сценарии:

while read a
do
    echo before
    read var
    echo after
done < file1

Результат:

before
after.

Вы можете помочь мне решить эту проблему ????

1
mehdi 26 Мар 2014 в 03:52
1
Пожалуйста, покажите нам настоящую ошибку.
 – 
Saucier
26 Мар 2014 в 03:57
Откуда вы хотите, чтобы read внутри цикла читал? Терминал (даже если ввод-вывод перенаправлен из канала или файла)? Из стандартного ввода основного скрипта? @kojiro дал вам достойный ответ.
 – 
Jonathan Leffler
26 Мар 2014 в 04:10

1 ответ

Лучший ответ

Дескриптор файла может указывать только на один файл за раз. Каждый вызов read, который у вас там, читается со стандартного ввода, включая тот, который находится посередине. Если вы хотите read от чего-то другого, вы должны указать read использовать другой файловый дескриптор.

exec 5< file1 # assign file1 to the file descriptor number 5.
              # ("open for reading" as it were)
while read <&5 a; do # read from fd5
  echo before
  read var # read from fd0
  echo after
done
exec 5<&- # Reset fd 5 ("close the file" as it were)

Вы также можете использовать read -u 5 для чтения из определенного дескриптора в bash.

3
kojiro 26 Мар 2014 в 04:09
1
Вы можете подумать о том, чтобы задокументировать альтернативу read <&5 для людей, не использующих bash.
 – 
Charles Duffy
26 Мар 2014 в 04:05
1
Следует ли добавить exec 5<&- после цикла для симметрии и очистки? Ясно, что если сценарий вот-вот завершится, это далеко не критично, но закрытие того, что вы открываете, обычно является хорошей идеей и позволяет избежать утечки / исчерпания ресурсов.
 – 
Jonathan Leffler
26 Мар 2014 в 04:09
В любом случае спасибо @DigitalTrauma за помощь :)
 – 
mehdi
26 Мар 2014 в 04:26
Я бы подумал о том, чтобы определить перенаправление на цикл, вместо того, чтобы запускать его раньше и очищать после. (while ... done 5< file1)
 – 
Charles Duffy
26 Мар 2014 в 04:34