В стандартных шеллах вроде bash, чтобы поработать со строками, обычно приходится пайпить переменные в
sed, basename и прочие утилиты. В Zsh эта логика встроена прямо в синтаксис расширения переменных.Да, это ломает переносимость скриптов из-за несовместимости с POSIX. Но для интерактивной работы и личных конфигов это на порядок быстрее и удобнее.
Самый полезный модификатор?
:r (root) — отрезает расширение файла.Синтаксис такой:
${file:r}Допустим, нужно передать имя файла (
game.cpp) и чтобы итоговый бинарник назывался так же (game), не прописывая имя дважды.Используем
${1:r}, чтобы автоматически убрать расширение из аргумента. Пример функции в Zsh:function grun() {
# $1 это "game.cpp"
# ${1:r} станет "game"
g++ -Wall -std=c++17 "$1" -o "${1:r}" && ./"${1:r}"
}Запуск
grun main.cpp скомпилирует и сразу запустит main – одним махом.Как только начинаешь активно использовать модификаторы, назад уже не хочется.
Ещё полезные модификаторы:
:e — получить только расширение:a — получить абсолютный путь:h — получить имя родительской директории:t — получить basenameИ да, снова: переносимость скриптов ограничена из-за несовместимости с POSIX.
👉 DevOps Portal
