Я хочу использовать read cmd через некоторое время, чтобы читать строку для каждой строки из файла, но у меня проблема в строке 4 в этом сценарии:
while read a
do
echo before
read var
echo after
done < file1
Результат:
before
after.
Вы можете помочь мне решить эту проблему ????
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.
read <&5
для людей, не использующих bash.
exec 5<&-
после цикла для симметрии и очистки? Ясно, что если сценарий вот-вот завершится, это далеко не критично, но закрытие того, что вы открываете, обычно является хорошей идеей и позволяет избежать утечки / исчерпания ресурсов.
while ... done 5< file1
)
Похожие вопросы
Новые вопросы
bash
Для вопросов о скриптах, написанных для командной оболочки Bash. Для сценариев оболочки с ошибками / синтаксическими ошибками, пожалуйста, проверьте их с помощью программы shellcheck (или на сервере веб-проверки оболочки по адресу https://shellcheck.net) перед размещением здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут касаться темы Super User, а не переполнения стека.
read
внутри цикла читал? Терминал (даже если ввод-вывод перенаправлен из канала или файла)? Из стандартного ввода основного скрипта? @kojiro дал вам достойный ответ.