Введение

Командная строка остается верным союзником всех, кто занят в сфере технологий. Правильно подобранные инструменты CLI (интерфейс командной строки) и TUI (интерфейс пользователя терминала) могут значительно повысить эффективность рабочего процесса — будь то управление кластерами Kubernetes, создание кода, автоматизация развертывания или написание текстов в Markdown-файлах.

За годы своей деятельности я интегрировал в повседневный рабочий процесс различные CLI- и TUI-инструменты. Некоторые из них стали настолько необходимыми, что без них я уже не представляю свою работу. В этой статье расскажу о 10 инструментах, в полезности которых убеждался неоднократно.

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

Я использую эти инструменты в Linux, но они должны работать в большинстве операционных систем.

Для нетерпеливых предоставляю краткий перечень наиболее интересных случаев использования этих команд:

  • fzf: утилита, оптимизирующая рабочие процессы командной строки с помощью интерактивного поиска;
  • bpytop: монитор ресурсов, который показывает использование и статистику для процессора, памяти, дисков, сети и процессов;
  • tmux: терминальный мультиплексор для эффективного управления несколькими сессиями терминала;
  • lazygit: TUI для операций с git, упрощающий управление репозиторием;
  • gh (GitHub CLI): инструмент GitHub CLI для управления репозиториями, проблемами и PR из терминала;
  • entr: утилита, выполняющая команды при изменении файлов, полезная для автоматизации;
  • just: программа для выполнения команд, позволяющая управлять задачами конкретного проекта с помощью простых команд;
  • taskwarrior: инструмент командной строки для эффективного управления задачами;
  • tldr: упрощенные man-страницы с примерами быстрых команд;
  • pet: менеджер фрагментов для сохранения и повторного использования сложных команд командной строки.

Расширение возможностей терминала и навигация

Если CLI-инструменты — основа вашего ПО-инструментария, то обеспечение их надлежащего оснащения и универсальности должно быть главным приоритетом!

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

fzf (фильтр командной строки)

fzf — мощная утилита, которая может значительно оптимизировать рабочий процесс в командной строке. Вот три пользовательские функции, которые используют fzf для упрощения обычных задач (можете добавить их в .bash(zsh)rc).

1. Интерактивное уничтожение процесса (process killing, pkill):

function pkill() {
ps aux | fzf --height 40% --layout=reverse --prompt="Select process to kill: " | awk '{print $2}' | xargs -r sudo kill
}

Эта функция представляет интерактивный список запущенных процессов. С ее помощью можно найти и выбрать процесс для уничтожения. При этом не нужно запоминать PID (идентификационный номер процесса) или использовать grep.

Функция pkill в действии

2. Навигация по Git-логам и просмотр коммитов:

function logg() {
git lg | fzf --ansi --no-sort \
--preview 'echo {} | grep -o "[a-f0-9]\{7\}" | head -1 | xargs -I % git show % --color=always' \
--preview-window=right:50%:wrap --height 100% \
--bind 'enter:execute(echo {} | grep -o "[a-f0-9]\{7\}" | head -1 | xargs -I % sh -c "git show % | nvim -c \"setlocal buftype=nofile bufhidden=wipe noswapfile nowrap\" -c \"nnoremap <buffer> q :q!<CR>\" -")' \
--bind 'ctrl-e:execute(echo {} | grep -o "[a-f0-9]\{7\}" | head -1 | xargs -I % sh -c "gh browse %")'
}

Эта функция объединяет fzf с git log, предоставляя интерактивный интерфейс для просмотра Git-логов. Она предлагает предварительный просмотр каждого коммита и доступ к полной информации о коммите в Neovim или browse (просмотр) ее на GitHub. Это неоценимо для быстрой навигации по сложным Git-логам.

Предварительный просмотр Git-логов

3. Просмотр репозиториев:

function repo() {
export repo=$(fd . ${HOME}/dev --type=directory --max-depth=1 --color always| awk -F "/" '{print $5}' | fzf --ansi --preview 'onefetch /home/decoder/dev/{1}' --preview-window up)
if [[ -z "$repo" ]]; then
echo "Repository not found"
else
echo "Repository found locally, entering"
cd ${HOME}/dev/$repo
if [[ -d .git ]]; then
echo "Fetching origin"
git fetch origin
onefetch
fi
create_tmux_session "${HOME}/dev/$repo"
fi
}

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

Подробнее о функции  create_tmux_session funciton поговорим ниже.

Краткий обзор репозитория

bpytop (мониторинг ресурсов)

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

Для мониторинга производительности системы просто запустите:

bpytop

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

Чтобы интегрировать bpytop в свой рабочий процесс, добавьте эту привязку в .tmux.conf:

bind -n M-b popup -d '#{pane_current_path}' -E -h 95% -w 95% -x 100% "bpytop"
bpytop-мониторинг

tmux (терминальный мультиплексор)

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

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

Мы используем эту функцию в репозитории.

function create_tmux_session() {
local RESULT="$1"
zoxide add "$RESULT" &>/dev/null
local FOLDER=$(basename "$RESULT")
local SESSION_NAME=$(echo "$FOLDER" | tr ' .:' '_')

if [ -d "$RESULT/.git" ]; then
SESSION_NAME+="_$(git -C "$RESULT" symbolic-ref --short HEAD 2>/dev/null)"
fi

if ! tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
tmux new-session -d -s "$SESSION_NAME" -c "$RESULT"
fi

if [ -z "$TMUX" ]; then
tmux attach -t "$SESSION_NAME"
else
tmux switch-client -t "$SESSION_NAME"
fi
}

Эта функция выполняет несколько действий:

  1. Создает сессию tmux с именем папки проекта и Git-ветки.
  1. Она интегрируется с zoxide, умной cd-командой, чтобы отслеживать наиболее используемые каталоги.
  1. Проверяет, существует ли уже сессия. Если нет — создает ее.
  2. Либо подключается к сессии, либо переключается на нее в зависимости от того, находитесь ли вы уже в tmux.

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

Пример tmux-сессии

Оптимизация процесса разработки

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

lazygit (TUI Git)

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

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

Представление diff — одна из сильных сторон lazygit. Она позволяет легко просмотреть изменения перед коммитом, перейдя к файлу и нажав ‘d’. Такое визуальное представление изменений может быть невероятно полезным при подготовке коммитов.

Для более сложных Git-операций в lazygit есть такие функции, как интерактивное перемещение, или перебазирование (interactive rebasing). Вы можете запустить интерактивное перебазирование, перейдя к коммиту и нажав ‘r’, а затем ‘i’. В отличие от использования командной строки это гораздо упрощает такие задачи, как сквошинг и переупорядочивание коммитов.

lzazygit в действии

gh (GitHub CLI)

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

Создание репозитория GitHub

Создать новый репозиторий GitHub довольно легко с помощью gh. Просто выполните команду:

gh repo create my-new-repo --public --description "My new repository"

Эта команда создает новый публичный репозиторий с именем «my-new-repo» и указанным описанием. Можно также создавать приватные репозитории, добавив флаг --private.

Создание Gist

Gist’ы — отличная возможность делиться фрагментами кода или небольшими скриптами. Следующая команда позволит создать новый Gist с помощью gh:

gh gist create my_script.sh --public --desc "A simple bash script"

Эта команда создает публичный gist с контентом my_script.sh и указанным описанием. Для создания приватного gist можете опустить флаг --public.

Использование GitHub-команд с поддержкой искусственного интеллекта

GitHub интегрировал в gh возможности искусственного интеллекта для выполнения различных задач. Например, можно попросить Copilot GitHub предложить код прямо из терминала:

gh copilot suggest "Install git"

или в режиме объяснения:

gh copilot explain "traceroute github.com"

entr (event notify test runner — запуск тестирования при регистрации событий)

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

Например, можно настроить entr на запуск тестового набора при каждом изменении файла. Команда типа find . -name "*.go" | entr go test ./... будет автоматически запускать тесты Go при каждом сохранении файла .go. Такая немедленная обратная связь может оказаться бесценной во время разработки, управляемой тестами.

При работе над веб-приложениями entr может помочь с перезагрузкой в реальном времени. Команда find . -name "*.py" | entr -r python app.py перезапускает веб-сервер Python при каждом внесении изменений в код. Флаг -r гарантирует, что entr перезапустит команду при выходе.

Управление задачами и проектами

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

just (средство запуска команд)

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

По сути, just использует файл justfile (похожий на Makefile), в котором определяются команды или «рецепты». Эти рецепты могут быть простыми однострочниками или сложными скриптами, и выполняются они путем запуска команды just <recipe-name> в терминале.

Вот пример рецепта, создающего локальный кластер KIND:

# установка кластера kind
setup_kind cluster_name='control-plane':
#!/usr/bin/env bash
set -euo pipefail
echo "Creating kind cluster - {{cluster_name}}"
envsubst < kind-config.yaml | kind create cluster --config - --wait 3m
kind get kubeconfig --name {{cluster_name}}
kubectl config use-context kind-{{cluster_name}}

taskwarrior (управление задачами)

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

С помощью taskwarrior добавить новую задачу можно, просто набрав task add. Например, task add Write blog post about command-line tools due:tomorrow добавляет новую задачу с датой выполнения. Набрав затем task, можно просмотреть список ожидающих выполнения задач, отсортированных по срочности.

taskwarrior отлично справляется со сложными атрибутами задач. Можете добавлять приоритеты, теги, проекты и даже зависимости между задачами. Команда типа task 1 modify priority:H project:BlogPost +writing установит высокий приоритет, назначит его проекту BlogPost и добавит тег ‘writing’ к задаче 1.

Одной из самых мощных функций taskwarrior является надежная система фильтрации. Можно легко просматривать задачи по проектам (task project:BlogPost), дате выполнения (task due:today) или любой комбинации атрибутов. Такая гибкость позволяет сосредоточиться на том, что важно в каждый конкретный момент.

Я активно использую это приложение, и оно определенно заслуживает отдельной статьи!

Организация информации и справка

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

tldr (упрощенные man-страницы)

tldr — проект сообщества, направленный на упрощение man-страниц с помощью практических примеров. Он предоставляет краткие, сфокусированные на примерах описания инструментов командной строки, облегчая быстрое понимание и использование различных команд.

Просто наберите tldr, а затем имя команды. Например, tldr tar предоставит краткий обзор наиболее распространенных команд tar с практическими примерами.

Отличительная особенность tldr — ориентация на реальное использование. Вместо того чтобы осваивать детализированную документацию, можете сразу переходить к делу с помощью примеров, которые охватывают наиболее распространенные случаи использования.

Краткие сведения о команде tar 

 pet (менеджер фрагментов командной строки)

Назначение pet — помочь запомнить и быстро получить доступ к сложным командам, которые редко используются, но необходимы для рабочего процесса.

С помощью pet можно легко сохранять, искать и выполнять фрагменты команд прямо из терминала. Это особенно полезно для DevOps-инженеров и разработчиков, которые часто работают со сложными командами CLI.

Чтобы добавить новый фрагмент, можно воспользоваться командой pet new. В результате будет предложено ввести команду и описание. Например:

pet new
Command> awk -F, 'NR <=2 {print $0}; NR >= 5 && NR <= 10 {print $0}' company.csv
Description> Print specific lines from a CSV file

Заключение

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

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

Как и в случае с любым набором инструментов, максимальный эффект от CLI-инструментария можно получить только при внедрении его в повседневную практику. Начните с малого, может быть, с одного или двух инструментов, которые привлекут ваше внимание. Не успеете оглянуться, как обнаружите, что уже не можете без них обходиться.

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

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


Перевод статьи Piotr: 10 CLI Tools That Made the Biggest Impact

Предыдущая статьяАдаптируем Android-приложение к большим размерам экрана с помощью классов window-size
Следующая статьяПроектирование устойчивых API: постигаем искусство ограничения скорости