Ограничения по размеру применяются только при выделении статических буферов. gethostbyname(3)
, который анализирует записи в /etc/hosts
, не выделяет статические буферы -и никогда не выделял. Первоначальный выпуск BSD 4.3 1983 года показывает открытый -файл, в то время как строка синтаксического анализа закрывает шаблон -файла :
.
sethostent(0);
while (p = gethostent()) {
if (strcmp(p->h_name, name) == 0)
break;
for (cp = p->h_aliases; *cp != 0; cp++)
if (strcmp(*cp, name) == 0)
goto found;
}
found:
endhostent();
Современные реализации сохраняют это наследие во всех основных аспектах.
В любом случае, внутри семейства функций *hostent
хранится файловый указатель на текущую строку в файле. sethostent
открывает файл и устанавливает положение указателя файла. gethostent
получает данные и перемещает указатель. endhostent
закрывает указатель файла. Библиотека GNU C предлагает подробный справочник по этим функциям.
Как можно догадаться из реализации, записи, встречающиеся в файле раньше, разрешаются быстрее. Если ваш файл hosts огромен, это вступает в игру.
Таким образом, независимо от того, насколько велик файл, ОС будет использовать его. Однако в конце концов вы достигнете пределов файловой системы (согласно ответу Джеффа Шаллера). У вас также есть ограничения на максимальный размер строки (согласно ответу Кусалананды). Но, в конце концов, вы можете сделать его настолько большим, насколько захотите. Но пожалуйста, не надо.
Вы можете сделать что-то вроде этого:
echo "" | sh script.sh
По умолчанию эхо добавляет символ новой строки в конец строки -, что в основном вам и нужно.