Синтаксис zsh для расширения имен переменных, соответствующих префиксу

Ага.

Авторитетный Linux Page Cache Basics утверждает

File blocks are written to the Page Cache not just during writing, but also when reading files.

и

Automatically storing file blocks in the Page Cache is generally quite advantageous.

Это относится к блочным -файловым системам, то есть ccfs, ext?, gfs, ifs, xfs, как показано на его диаграмме . Это также подтверждается Page Cache, The Affair Between Memory and Files , в котором прямо говорится:

If you read a single byte from a file, the whole 4KB chunk containing the byte you asked for is read from disk and placed into the page cache.

и третий абзац этой веб-страницы подтверждает только блок размером 4 КБ, содержащий 1 КБ прочитанных данных, кэшированных в основной памяти, а не весь файл.

2
08.03.2021, 21:50
2 ответа

Другим вариантом сопоставления ключей специального ассоциативного массива$parameterявляется использование флага нижнего индексаI:

$ print -rC1 - $parameters[(I)ba*]
bar
baz

Это оператор ассоциативного массива , результатом которого является список/массив,в то время как ${(kM)parameters:#ba*}@Gille - это оператор списка/массива , применяемый к ключам ассоциативного массива, также приводящий к списку/массиву. В данном случае конечный результат практически одинаков.

Если вам нужно запомнить только один, ${(M)array:#pattern}, который являетсяgrep-для массивов -, является более полезным, поскольку он более общий. То, что он не может сделать по сравнению с флагами индекса массива , — это сопоставление ключей и возврат соответствующих значений или сопоставление значений и возврат соответствующих ключей.

Вы можете комбинировать оба варианта, как в:

$ print -rC1 - ${(Mk)parameters[(R)array*]:#pa*}
path
patchars

Здесь, чтобы вернуть имена массивов, которые начинаются с pa(, значения из $parametersсопоставляются с array*и ключами сpa*).

Конечно, вы можете сделать это для всех переменных интроспекции zsh($aliases, $commands, $functions, $builtins, $modules, $history...)

Для некоторых из них вы также можете запросить, используя параметр-m pattern(match )соответствующей встроенной функции (whence -m, alias -m, autoload -m, fc -m... ), но как для bash's compgenвы не можете надежно опубликовать -обработку их вывода, так как это строка -, в то время как некоторые из вещей, которые они сообщают, могут содержать символы новой строки.

2
18.03.2021, 22:26

Zsh не имеет специального синтаксиса для фильтрации имен переменных. Просто объединитеparametersассоциативный массив с функциями расширения параметров :${(k)…}, чтобы получить ключи (, которые являются именами параметров ), ${…:#…}для фильтрации по шаблону и ${(M)…}чтобы сохранить совпадения, а не удалять совпадения.

printf '%s\n' ${(kM)parameters:#ba*}
2
18.03.2021, 22:26

Теги

Похожие вопросы