Введение

Эффективная навигация по командной строке может значительно повысить производительность разработчика, особенно при использовании таких мощных оболочек, как Zsh. Будь вы опытным профи или любознательным новичком, освоение возможностей Zsh изменит ваш рабочий процесс. В данном руководстве вы найдете несколько важных приемов работы с Zsh — от навигации с помощью курсора до пользовательских команд, — которые упростят работу с терминалом. Расположив эти приемы в произвольном порядке, я все же постарался сгруппировать их в логические блоки. В каждом блоке представлены различные случаи практического применения.

Почему Zsh?

Zsh, или Z shell, — оболочка Unix, которая используется как интерактивная оболочка для входа в систему и как интерпретатор команд для написания скриптов оболочки. Zsh известна своим богатым набором функций, включающим эффективное редактирование командной строки, встроенную проверку орфографии и программируемое завершение команд. Это оболочка доступна для macOS по умолчанию, а также для различных операционных систем GNU-Linux. Она работает и в Windows с помощью Windows Subsystem for Linux.

Кому предназначена статья?

Материал статьи будет полезен:

  • разработчикам: если вы пишете код, автоматизируете задачи или управляете серверами, знание Zsh поможет работать эффективнее;
  • системным администраторам: возможности Zsh по написанию скриптов и богатый набор функций облегчают управление системами и автоматизацию задач;
  • инженерам DevOps: тем, кто занимается непрерывной интеграцией и развертыванием, владение Zsh поможет упростить работу и повысить производительность;
  • студентам и начинающим разработчикам: если вы новичок в работе с командной строкой, изучение Zsh заложит прочный фундамент в вашем процессе образования и сделает его более плавным;
  • энтузиасты технологий: если вы любите изучать новые инструменты и оптимизировать рабочий процесс, это руководство познакомит с некоторыми крутыми возможностями Zsh.

К концу статьи вы получите практические советы и рекомендации по повышению эффективности работы с командной строкой с помощью Zsh.

Навигация с помощью курсора и редактирование строк

Эффективное перемещение курсора и редактирование строк очень важны для производительности командной строки. Zsh предоставляет мощные шорткаты для улучшения этих операций, облегчая быструю навигацию и редактирование команд.

Перемещение курсора

Эффективное перемещение курсора может сэкономить много времени, особенно при работе с длинными командами.

  • Ctrl + A — переместить курсор в начало строки;
  • Ctrl + E — переместить курсор в конец строки.

Эти сочетания клавиш позволяют быстро перейти к началу или концу командной строки, что особенно удобно, когда нужно отредактировать начало или конец команды.

Удаление текста

Эффективное удаление текста позволяет исправлять ошибки и изменять команды, не перенабирая их полностью.

  • Ctrl + U — удалить от курсора до начала строки;
  • Ctrl + K — вырезать от курсора до конца строки;
  • Ctrl + W — вырезать от курсора до начала предыдущего слова;
  • Alt + D — удалить от курсора до конца следующего слова.

Эти сочетания клавиш позволяют быстро удалять большие фрагменты текста, будь то очистка всей строки или просто удаление последнего набранного слова.

Манипулирование текстом

Манипулирование текстом непосредственно из командной строки может повысить эффективность работы, позволяя быстро вносить изменения и исправления.

  • Ctrl + Y — вставить (восстановить из буфера) ранее вырезанный текст;
  • Ctrl + Shift + _ — отменить последнее нажатие клавиши в команде;
  • Ctrl + XT — поменять текущее слово на предыдущее;
  • Ctrl + Q — переместить текущую команду в буфер, очистить строку для новой команды.

Используя эти сочетания клавиш, можно легко перемещать текст, отменять ошибки и восстанавливать ранее удаленный текст, что делает работу с командной строкой более плавной.

Редактирование команд

Иногда нужны более продвинутые возможности редактирования для точной настройки команд.

Ctrl + XE — редактирование текущей команды в редакторе по умолчанию.

Глоббинг 

Zsh предоставляет расширенные возможности глоббинга (подстановки/универсализации файловых имен) для гибкого сопоставления файлов, что является эффективным способом манипулирования файлами и каталогами. Глоббинг позволяет задавать шаблоны, сопоставляющие несколько имен файлов, что повышает эффективность работы с группами файлов, каталогами и т. д.

Стандартный глоббинг 

Стандартный глоббинг использует подстановочные знаки (wildcards) для сопоставления имен файлов на основе простых шаблонов.

  • *.txt — сопоставляет все файлы .txt в текущем каталоге;
  • file?.txt — сопоставляет файлы типа file1.txtfile2.txt и т. д. в текущем каталоге.

Эти шаблоны помогают быстро выбирать группы файлов и работать с ними, не вводя каждое имя файла по отдельности.

Рекурсивный глоббинг

Рекурсивный глоббинг расширяет стандартные шаблоны для поиска по каталогам и подкаталогам.

  • **/*.txt — сопоставляет все файлы .txt в каталогах рекурсивно.

Эта мощная функция позволяет искать файлы во всем дереве каталогов, облегчая поиск и работу с файлами независимо от их местоположения.

Расширенный глоббинг

Расширенные функции глоббинга в Zsh предоставляют еще более продвинутые возможности сопоставления с шаблоном.

Запустите расширенный глоббинг с помощью следующей команды:

setopt EXTENDED_GLOB

Теперь можете использовать дополнительные возможности сопоставления с шаблоном:

  • ls *(.) — список только обычных файлов;
  • ls *(/) — список только каталогов;
  • ls *(-/) — список только каталогов и символических ссылок на каталоги.

Расширенный глоббинг позволяет выполнить поиск файлов с большей точностью, упрощая фильтрацию и составление списков файлов по определенным критериям.

Примеры использования глоббинга 

Вот несколько практических примеров использования глоббинга для управления файлами:

  • mv *.txt backup/ — переместить все файлы .txt в каталог backup;
  • rm **/*.log — удалить все файлы .log в текущем каталоге и всех подкаталогах;
  • cp *.{jpg,png} images/ — скопировать все файлы .jpg и .png в каталог images.

Использование возможностей глоббинга позволяет оптимизировать задачи управления файлами и упростить работу с большими множествами файлов и каталогов.

История команд и расширение

Zsh предлагает надежные функции для возврата команд и манипулирования предыдущими или текущими командами. Эти функции позволяют эффективно повторно использовать и изменять команды, что может сэкономить значительное количество времени, особенно при работе со сложными командами или длинными последовательностями команд.

Возврат к истории

Zsh предоставляет шорткаты для возврата к истории и повторного использования предыдущих команд или их аргументов:

  • Ctrl + r — отобразить историю команд и выполнить навигацию по буферу истории с помощью Ctrl + P and Ctrl + N (при условии, что не включен режим клавиш vim);
  • Alt + . или <Esc> + . — вставить последний аргумент предыдущей команды (то же самое, что и !$);
  • <Esc> + _ — вставить последнее слово предыдущей команды, выполнив циклический перебор аргументов;
  • !! — повторить всю предыдущую команду (полезно для sudo !! — добавить sudo к предыдущей команде);
  • !:0 — повторить предыдущую команду без аргументов;
  • !vi — запустить последнюю команду, которая начиналась с ‘vi’.

Эти сочетания клавиш позволяют быстро находить ранее используемые команды, что дает возможность изменять и повторно выполнять их, не набирая всю команду заново.

Модификация истории

Модификация ранее выполненных команд поможет исправить ошибки или подстроить команды под разные задачи, не начиная работу с нуля:

  • !!:s/x/y — заменить ‘x’ на ‘y’ в предыдущей команде;
  • ^foo^bar — заменить ‘foo’ на ‘bar’ в предыдущей команде и выполнить ее.

Сочетания клавиш для изменения истории особенно полезны для исправления опечаток или изменения параметров в только что выполненных командах.

Расширение текущей команды

Можно также расширить аргументы текущей командной строки, что облегчает повторное использование частей команд:

  • !#^ — расширить первый аргумент текущей команды;
  • !#$ — расширить последний аргумент текущей команды.

Это очень полезно, например, при копировании или переименовании файла с длинным именем:

  • cp reallylongnamefile backup-!#$  расширится до имени файла после нажатия Tab.

Быстрые исправления

В Zsh есть несколько сочетаний клавиш для быстрого исправления и повторного выполнения команд:

  • fc — исправить команду: открывает последнюю команду в редакторе.
  • r — повторить последнюю команду (может сочетаться с подстановкой, например, r foo=bar).

Используя эти сочетания клавиш, можно открывать предыдущие команды в текстовом редакторе по умолчанию для быстрых исправлений или просто повторно выполнять команды с небольшими модификациями.

Примеры возврата к истории и расширения команд 

Вот несколько практических примеров, демонстрирующих возможности использования истории и расширения команд:

  • !!:s/foo/bar — повторно выполнить предыдущую команду с заменой ‘foo’ на ‘bar’;
  • ^error^success — исправить «error» на «success» в последней выполненной команде и запустить ее снова;
  • echo "Hello, World!" !:0 — повторить последнюю команду без аргументов;
  • sudo !! — повторно выполнить предыдущую команду с sudo.

Расширение параметров и переменные оболочки

Zsh предоставляет мощные возможности для работы с параметрами и переменными оболочки, облегчая управление данными и автоматизацию задач в среде оболочки.

Позиционные параметры

Позиционные параметры — это переменные, которым присваиваются значения из аргументов, переданных скрипту или функции.

  • $# — количество позиционных параметров, переданных скрипту или функции;
  • $@ — все позиционные параметры, заключенные в отдельные кавычки;
  • $* — все позиционные параметры в виде одной строки, разделенной пробелами.

Эти параметры позволяют получить доступ к аргументам, передаваемым скриптам и функциям, и манипулировать ими, делая скрипты более гибкими и мощными.

Специальные переменные

Специальные переменные предоставляют информацию о текущем состоянии оболочки или последней выполненной команде.

  • $? — состояние выхода из последней выполненной команды;
  • $_ — последний аргумент предыдущей команды.

Со множеством других специальных переменных можно ознакомиться в документации zsh.

Расширение параметров

Расширение параметров позволяет манипулировать значениями переменных различными способами.

Базовое расширение:

  • ${var} — расширить до значения var.

Значения по умолчанию:

  • ${var:-default} — использовать default, если var не задано или равно null;
  • ${var:=default} — присвоить default переменной var, если var не задана или равна null.

Манипулирование строками:

  • ${var#pattern} — удалить самое короткое сопоставление pattern из начала var;
  • ${var##pattern} — удалить самое длинное сопоставление pattern из начала var;
  • ${var%pattern} — удалить самое короткое сопоставление pattern из конца var;
  • ${var%%pattern} — удалить самое длинное сопоставление pattern из конца var.

Извлечение подстроки:

  • ${var:offset} — извлечение подстроки из var, начиная с offset;
  • ${var:offset:length} — извлечение символов length подстроки из var, начиная с offset.

Эти расширения предоставляют мощные инструменты для работы со строками и переменными в скриптах и командах оболочки.

Примеры использования расширения параметров и переменных оболочки 

Вот несколько практических примеров, демонстрирующих использование расширения параметров и переменных оболочки:

  • ${filename%.txt}.md — изменить расширение имени файла (filename) с .txt на .md;
  • ${var:-default} — использовать значение по умолчанию (default), если var не задана или равна null;
  • ${var:1:3} — извлечь из var три символа, начиная со второго.

Использование переменных оболочки в скриптах

Использование этих возможностей позволяет создавать более надежные и гибкие скрипты. Например:

#!/bin/zsh
greet() {
local name=${1:-User}
echo "Hello, $name!"
}
greet "Alice"
greet

В этом скрипте функция greet использует позиционный параметр со значением по умолчанию, благодаря чему у нее всегда есть значение для работы.

Операции с путями и именами файлов

Zsh предоставляет различные сочетания клавиш и приемы для работы с путями и именами файлов, упрощая процесс управления файлами и каталогами.

Расширение пути

Расширение пути помогает быстро перемещаться и работать с путями файлов.

  • /u/lo/b<Tab> — быстрое расширение пути (например, расширение до /usr/local/bin).

Эта функция позволяет вводить часть пути и использовать клавишу Tab для автоматического заполнения, что экономит время и уменьшает количество ошибок при вводе.

Манипулирование именами файлов

Zsh предлагает несколько расширений параметров для работы с именами файлов, которые могут быть очень полезны в скриптах и операциях командной строки.

Удаление расширения:

${file:r} — удалить расширение из переменной filename.

Получение расширения:

${file:e} — получить только расширение из переменной filename.

Преобразование в верхний регистр:

${file:u} — преобразовать переменную filename в верхний регистр.

Преобразование в нижний регистр:

${file:l} — преобразовать переменную filename в нижний регистр.

Эти расширения позволяют извлекать или изменять определенные части имен файлов без использования внешних инструментов или сложных команд.

Примеры использования операций с путями и именами файлов 

Вот несколько практических примеров использования возможностей Zsh по работе с путями и именами файлов:

  • file="example.txt" — определить переменную filename;
  • echo ${file:r} — вывод: example (удаление расширения .txt);
  • echo ${file:e} — вывод: txt (получение расширения);
  • echo ${file:u} — вывод: EXAMPLE.TXT (преобразование в верхний регистр);
  • echo ${file:l} — вывод: example.txt (преобразование в нижний регистр).

Использование в реальных скриптах

Использование этих функций в реальных скриптах может упростить и ускорить решение задач по работе с файлами. Например:

#!/bin/zsh
process_files() {
for file in *.txt; do
local base_name=${file:r}
local new_name="${base_name}.md"
mv "$file" "$new_name"
echo "Renamed $file to $new_name"
done
}
process_files

В этом скрипте функция process_files переименовывает все файлы .txt в текущем каталоге в файлы .md, используя возможности Zsh по работе с именами файлов.

Быстрое расширение пути

Zsh также поддерживает быстрое расширение пути, что повышает эффективность навигации по каталогам:

cd /u/lo/b<Tab>  # Expands to /usr/local/bin

Расширение скобок и диапазонов

Zsh предлагает мощные возможности для создания последовательностей и множеств элементов с помощью расширения скобок и диапазонов. Эти функции невероятно полезны для создания списков, каталогов или файлов систематическим и эффективным способом.

Расширение скобок

Расширение скобок позволяет генерировать произвольные строки, задавая шаблоны в фигурных скобках {}. Это необходимо для создания нескольких элементов с похожими именами.

Примеры:

  • echo {apple,banana,cherry} — расширяется до apple banana cherry;
  • mkdir -p project/{src,bin,lib} — создаются каталоги project/srcproject/bin и project/lib.

Используя расширение скобок, можно быстро создавать множества строк или каталогов, не набирая ничего по отдельности.

Расширение диапазонов

Расширение диапазонов генерирует последовательности цифр или букв, что может быть очень удобно для создания упорядоченных списков.

Числовой диапазон:

  • echo {1..5} — расширяется до 1 2 3 4 5;
  • echo {001..005} — расширяется до 001 002 003 004 005.

Буквенный диапазон:

  • echo {a..e} — расширяется до a b c d e;
  • echo {A..E} — расширить до A B C D E.

Расширение диапазонов упрощает процесс генерации последовательностей, особенно при работе с большими диапазонами или сложными шаблонами.

Комбинирование расширений скобок и диапазонов

Комбинирование расширений скобок и диапазонов позволяет создавать более сложные шаблоны.

Примеры:

  • echo file{1..3}.{txt,md} — расширение до file1.txt file1.md file2.txt file2.md file3.txt file3.md;
  • mkdir project{A..C}/{src,bin,lib} — создание каталогов типа projectA/srcprojectA/binprojectA/lib и так далее для projectB и projectC.

Эта комбинация обеспечивает мощный способ создания сложных множеств элементов с минимальными усилиями.

Случаи использования на практике

Ниже приведено несколько практических примеров, демонстрирующих использование расширения скобок и диапазонов:

Создание нескольких файлов:

touch {chapter1,chapter2,chapter3}.md

Генерация последовательностей в скриптах:

for i in {1..10}; do
echo "Item $i"
done

Пакетное переименование файлов:

for file in img{001..005}.jpg; do
mv "$file" "${file%.jpg}.png"
done

Создание серии каталогов:

mkdir -p project/{module1,module2}/{src,bin,doc}

Генерация HTML-файлов:

touch {index,about,contact}.html

Создание нумерованных файлов с ведущими нулями:

touch file{001..010}.txt

Техники навигации по каталогам

Эффективная навигация по каталогам имеет решающее значение для производительности командной строки. Zsh предоставляет несколько шорткатов и функций для упрощения перемещения между каталогами. 

Шорткаты для работы с каталогами

В Zsh есть удобные шорткаты для быстрой навигации по структуре каталогов:

cd - - Переход в предыдущий каталог, в котором вы находились. Это полезно, когда вам нужно часто переключаться между двумя каталогами.
cd ~ - Переход в домашний каталог. Быстрый способ вернуться в домашнюю базу из любой точки файловой системы.
cd / - Переход в корневой каталог. Полезно для доступа к верхнему уровню файловой системы.
cd ... - Переход на один уровень каталога вверх. Полезно для возврата к дереву каталогов.
cd ../... - Переход на два уровня вверх по каталогу. Можно составить цепочку из нескольких ..., чтобы подняться еще выше по структуре каталогов.
cd - - Переход к предыдущему каталогу, в котором вы находились.
cd -<Tab> - Переход к списку каталогов, в которых вы побывали.

Пользовательские команды и привязки клавиш

Zsh позволяет создавать пользовательские команды и привязки клавиш, что еще больше повышает производительность рабочего процесса. Благодаря этим возможностям, пользователь может настроить оболочку под свои нужды, сделав ее более эффективной и персонализированной.

Представление о BUFFER и zle

  • BUFFER — текущий контент командной строки, манипулируя которым можно изменить текст в командной строке;
  • zle (Zsh Line Editor — строковый редактор Zsh) используется для работы с командной строкой, позволяя создавать пользовательские виджеты и привязки клавиш.

Создание пользовательских команд

Создание пользовательских команд в Zsh может упростить выполнение повторяющихся задач и повысить эффективность работы.

Например, можно создать функцию для копирования всей командной строки в буфер обмена:

copy_line_to_clipboard() {
echo -n $BUFFER | xclip -selection clipboard
}
zle -N copy_line_to_clipboard

Эта функция использует xclip для копирования BUFFER (содержимого текущей командной строки) в буфер обмена.

Добавление пользовательских привязок клавиш

Чтобы оптимизировать рабочий процесс, можно привязать пользовательские функции или существующие команды ZLE к определенным последовательностям клавиш.

  • bindkey '^Y' copy_line_to_clipboard — привязать сочетание клавиш Ctrl+Y к функции copy_line_to_clipboard;
  • bindkey '^@' autosuggest-accept — привязать сочетание клавиш Ctrl+Space к функции принятия автосообщений;
  • bindkey '^X^T' transpose-words — привязать сочетания Ctrl+X и Ctrl+T для переноса слов.

Эти привязки позволяют быстро получить доступ к пользовательским командам и другим полезным функциям прямо с клавиатуры.

Примеры пользовательских команд и привязок клавиш

Приведем несколько практических примеров использования пользовательских команд и привязок клавиш:

Открытие текущей команды в редакторе по умолчанию:

edit_command_in_editor() {
BUFFER="vim $(fc -ln -1)"
zle accept-line
}
zle -N edit_command_in_editor
bindkey '^Xe' edit_command_in_editor

Быстрая очистка экрана и отображение текущего каталога:

clear_and_display_dir() {
clear
echo "Current Directory: $(pwd)"
}
bindkey '^L' clear_and_display_dir

Использование пользовательских команд в скриптах

Пользовательские команды также можно использовать в скриптах, чтобы повысить их функциональность и удобство обслуживания.

#!/bin/zsh
# Пользовательская функция для резервного копирования файлов
backup_files() {
local backup_dir="/backup/$(date +%Y%m%d)"
mkdir -p "$backup_dir"
cp -r ~/Documents/* "$backup_dir"
echo "Backup completed at $backup_dir"
}
# Пользовательская привязка клавиш для вызова функции резервного копирования
zle -N backup_files
bindkey '^B' backup_files
# Выполнение функции резервного копирования при условии запуска этого скрипта напрямую
if [[ "${(%):-%N}" == "${(%):-%x}" ]]; then
backup_files
fi

В этом скрипте функция backup_files создает резервную копию каталога Documents. Функция привязана к Ctrl+B для быстрого доступа, а скрипт также запускает функцию напрямую при условии выполнения.

Ознакомьтесь с другими привязками клавиш и идеями конфигурации в моем .zshrc config на GitHub.

Заключение

Освоение Zsh превратит вашу работу с командной строкой из сложной, чреватой ошибками задачи в упорядоченный, эффективный рабочий процесс. Используя мощные возможности оболочки Zsh — от навигации с помощью курсора и редактирования строк до пользовательских команд и привязки клавиш, — вы значительно повысите свою производительность. Разумеется, вам придется учиться, но в конечном итоге это того стоит.

Zsh — не просто оболочка, это еще и скриптовый язык, открывающий путь к более продуктивной и эффективной работе с командной строкой. Будь вы разработчиком, системным администратором, инженером DevOps или просто любителем технологий, освоение Zsh позволит вам добиваться большего с меньшими усилиями.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Piotr: The Zsh Shell Tricks I Wish I’d Known Earlier

Предыдущая статьяШаблоны проектирования распределенных систем и не только