Ага.
Авторитетный 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 КБ прочитанных данных, кэшированных в основной памяти, а не весь файл.
Другим вариантом сопоставления ключей специального ассоциативного массива$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
вы не можете надежно опубликовать -обработку их вывода, так как это строка -, в то время как некоторые из вещей, которые они сообщают, могут содержать символы новой строки.
Zsh не имеет специального синтаксиса для фильтрации имен переменных. Просто объединитеparameters
ассоциативный массив с функциями расширения параметров :${(k)…}
, чтобы получить ключи (, которые являются именами параметров ), ${…:#…}
для фильтрации по шаблону и ${(M)…}
чтобы сохранить совпадения, а не удалять совпадения.
printf '%s\n' ${(kM)parameters:#ba*}