Первый цикл работает, потому что перенаправление после done
применяется ко всему циклу, поэтому read
выполняет чтение из файла, а не из стандартного ввода сценария.
Второйверсия зависает, потому что read
читает из дескриптора файла 0, который является стандартным вводом, и вы ничего там не набрали.Строка exec
перенаправляет файловый дескриптор 3 для чтения из файла, но вы не читаете из файлового дескриптора 3.
Вы можете спасти вторую, используя:
exec <file.txt
Сейчасстандартный ввод читается из именованного файла.