exec 10<&0
клонирует дескриптор файла с номера 0 в номер 10, эффективно сохраняя оригинал, чтобы вы могли заменить файл на fd 0 в следующей строке. Чтобы отменить это, вам нужно поменять местами числа, клонировать номер 10 в номер 0, exec 0<&10
(, а затем закрыть fd 10 с помощьюexec 10<&-
).
С другой стороны, exec 0<10
без амперсанда — это просто перенаправление с именем файла 10
. Поскольку у вас нет такого файла, вы получите сообщение об ошибке.
Тем не менее, вам не нужно использовать exec
для временной настройки перенаправления для цикла while. Составные команды также могут принимать перенаправления, например:
while read LINE; do
...
done < "$filename"
Если вы хотите читать полные строки, как они есть, без пробелов или обратной косой черты, влияющих на данные, вам нужно сбросить IFS
для read
и использовать read -r
. Кроме того, если вы добавляете к массиву, вам не нужно вручную следить за индексами, вы можете просто использовать +=
для добавления непосредственно в массив:
arr=() # declares it an array and clears it, not strictly necessary though
while IFS= read -r line; do
arr+=("$line")
done < "$filename"
Или используйтеmapfile
(readarray
)вместо ручного цикла, как @BlackJack упоминает в комментариях:
mapfile -t arr < "$filename"
Или вообще без временного файла:
#/bin/bash
mapfile -t arr < <(curl -s https://unix.stackexchange.com/)
(Без -t
mapfile
оставляет ограничители строк на месте.)
Изучая эту тему, я нашел только обходные пути, а не настоящие решения, о которых вы просите:
Если вам нужна поддержка больших файлов -, то есть > 4 ГБ -, вы можете попробовать использовать exFAT вместо FAT32.