Хитрости Zsh Shell, о которых я хотел бы знать раньше
Эффективная навигация по командной строке может значительно повысить вашу производительность, особенно при использовании мощных оболочек, таких как Zsh. Независимо от того, являетесь ли вы опытным разработчиком или любопытным новичком, освоение функций Zsh может преобразовать ваш рабочий процесс. В этом руководстве мы покажем вам некоторые важные советы и приемы Zsh, от навигации курсором до пользовательских команд, которые упростят ваш опыт работы с терминалом. Они не имеют определенного порядка, однако мы попытались сгруппировать их в логические блоки. Каждая глава показывает различные практические приложения.
Почему Zsh?
Zsh или Z shell, — это оболочка Unix, которую можно использовать как интерактивную оболочку входа и как интерпретатор команд для сценариев оболочки. Zsh известен своим богатым набором функций, который включает мощное редактирование командной строки, встроенную проверку орфографии и программируемое завершение команд. Это оболочка по умолчанию для macOS, доступная в различных операционных системах GNU-Linux. Она также будет работать в Windows с подсистемой Windows для 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 предоставляет расширенные функции подстановки для гибкого сопоставления файлов, что является мощным способом обработки файлов и каталогов. Подстановка позволяет вам указывать шаблоны, которые соответствуют нескольким именам файлов, что позволяет вам работать с группами файлов, каталогами и т. д. очень эффективно.
Стандартная подстановка
Стандартная подстановка использует подстановочные знаки для сопоставления имен файлов на основе простых шаблонов.
*.txt
— найти все.txt
файлы в текущем каталоге.file?.txt
— сопоставление файлов типаfile1.txt
,file2.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
не установлено или равно нулю.${var:=default}
— назначить,var
равныйdefault
еслиvar
не установлено или равно нулю.
Манипуляции со строками:
${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
не установлено или равно нулю.${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}
— удалить расширение из переменной имени файла.
Получить расширение:
${file:e}
— получить только расширение из переменной имени файла.
Преобразовать в верхний регистр:
${file:u}
— преобразовать переменную имени файла в верхний регистр.
Преобразовать в нижний регистр:
${file:l}
— преобразовать переменную имени файла в нижний регистр.
Эти расширения позволяют извлекать или изменять определенные части имен файлов без необходимости использования внешних инструментов или сложных команд.
Примеры операций с путями и именами файлов в действии
Вот несколько практических примеров использования функций Zsh по управлению путями и именами файлов:
file="example.txt"
— определите переменную имени файла.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> # Расширяется до /usr/local/bin
Расширения скобок и диапазонов
Zsh предлагает мощные функции для генерации последовательностей и наборов элементов с использованием расширений скобок и диапазонов. Эти функции невероятно полезны для создания списков, каталогов или файлов систематическим и эффективным образом.
Расширение скобок
Расширение скобок позволяет вам генерировать произвольные строки, указывая шаблоны внутри скобок {}
. Это особенно полезно для создания нескольких элементов с похожими именами.
Примеры:
echo {apple,banana,cherry}
— расширяется доapple banana cherry
.mkdir -p project/{src,bin,lib}
— создает каталогиproject/src
,project/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/src
,projectA/bin
,projectA/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 -<Tab> — переключить список каталогов , которые вы посетили.
Пользовательские команды и сочетания клавиш
Zsh позволяет создавать пользовательские команды и сочетания клавиш для дальнейшего улучшения вашего рабочего процесса. Эти функции позволяют вам адаптировать оболочку к вашим конкретным потребностям, делая ее более эффективной и персонализированной.
Понимание BUFFER и zle
BUFFER
— представляет текущее содержимое командной строки. Вы можете манипулировать им, чтобы изменить текст в командной строке.zle
(Zsh Line Editor) — используется для управления командной строкой. Позволяет создавать пользовательские виджеты и сочетания клавиш.
Создание пользовательских команд
Создание пользовательских команд в Zsh может упростить повторяющиеся задачи и повысить вашу эффективность.
Например, вы можете создать функцию для копирования всей командной строки в буфер обмена:
copy_line_to_clip () {
echo -n $BUFFER | xclip -selection буфер обмена
}
zle -N copy_line_to_clip
Эта функция 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
для быстрого доступа, а скрипт также запускает функцию напрямую, если выполняется.
Заключительные мысли
Освоение Zsh может превратить ваш опыт работы с командной строкой из сложной, подверженной ошибкам задачи в оптимизированный, эффективный рабочий процесс. Используя его мощные функции, от навигации курсора и редактирования строк до пользовательских команд и сочетаний клавиш, вы можете значительно повысить свою производительность. Конечно, есть кривая обучения, но это того стоит в долгосрочной перспективе.
Zsh — это не просто оболочка, это также язык сценариев и шлюз к более продуктивному и эффективному способу работы с командной строкой. Независимо от того, являетесь ли вы разработчиком, системным администратором, инженером DevOps или просто любителем возиться с технологиями, освоение Zsh позволит вам делать больше с меньшими усилиями.