Вы можете сохранить его как массив, а не строку, чтобы использовать позже во многих случаях, и позволить подстановке произойти, когда вы его определите. В вашем случае, например:
k=(~/code/public/*/*.launch)
for i in "${k[@]}"; do
или в более позднем примере, вам потребуется eval
некоторые строки
dirs=(~/code/private/* ~/code/public/*)
for i in "${dirs[@]}"; do
for j in $exclude; do
eval "for k in $i/$j; do tmutil addexclusion \"\$k\"; done"
done
done
Проблемные эффекты включают медленное разрешение имени хоста (, если ОС каким-то образом не преобразует линейный список в более быструю структуру поиска -в -? )и возможность неожиданного взаимодействия с оболочкой вкладка завершение задолго до того, как будет достигнут какой-либо значимый размер файла.
Например! Если разместить 500 000 записей хостов в/etc/hosts
# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts
для науки, имя хоста по умолчанию вкладка завершение в ZSH занимает около ~25 секунд в моей системе, чтобы вернуть запрос на завершение (предоставлено, это на ноутбуке 2008 года с 5400 об/мин диск, но все же ).
Я не думаю, что у него есть ограничение по количеству строк.
До использования DNS (в 1985 году )именно этот файл служил единственным средством для поиска имен хостов, поэтому я предполагаю, что это означает, что файл должен иметь тысячи или, по крайней мере, сотни записей, чтобы иметь возможность поддерживать наиболее -подключенные интернет-узлы до -1985 года.
Вот пример из 1985 года (формат несколько изменился):http://jim.rees.org/apollo-archive/hosts.txtВ этом файле 1680 строк, из которых 1325 строк хоста. Остальные 355 строк пустые, комментарии, сети или шлюзы 1 .
Единственное реальное ограничение, которое я смог найти, заключалось в том, что в некоторых системах отдельные строки ограничены менее чем BUFSIZ
символами (1024 на моей машине с OpenBSD ).
Если у вас более пары записей в /etc/hosts
, вам следует подумать о настройке локального сервера имен, но это мое личное мнение.
1Спасибо Джеффу Шаллеру за то, что раскопал это.
... Я ломал голову, и за всю свою жизнь я не могу вспомнить ни одной ситуации или обстоятельства, когда вы подошли бы к какому-либо вопросу ограничения размера в /etc/hosts
--, вы столкнулись бы с практическими такие проблемы, как резкое снижение производительности семейства системных вызовов getaddrinfo()
, которые все должны сверяться с файлом, прежде чем решить, отправлять ли DNS-запрос, не говоря уже о проблемах с поддержкой простого текстового файла такого размера.
Я подозреваю, что здесь мы имеем дело с неспособностью общаться на более высоком уровне. Какую проблему вы пытаетесь решить с помощью гигантского /etc/hosts
файла? Я почти уверен, что есть лучшее решение, чем это.
Ограничения по размеру применяются только при выделении статических буферов. 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 огромен, это вступает в игру.
Таким образом, независимо от того, насколько велик файл, ОС будет использовать его. Однако в конце концов вы достигнете пределов файловой системы (согласно ответу Джеффа Шаллера). У вас также есть ограничения на максимальный размер строки (согласно ответу Кусалананды). Но, в конце концов, вы можете сделать его настолько большим, насколько захотите. Но пожалуйста, не надо.
How can I determine the size limit of /etc/hosts?
Это обычный файл, поэтому ограничение будет соответствовать ограничениям базовой файловой системы (, которые сами будут ограничены количеством дисков позади него )за вычетом пространства, используемого любыми другими файлами в том же (вероятно корневая(/
))файловая система:
How can I set the size limit of /etc/hosts?
Так как это редактируемый вручную -файл, только вручную:
sed -i '100,$d' /etc/hosts
(для удаления строк 100 и далее ).