«Консоль» — платформа, которая автоматизирует работу с самозанятыми, ИП и работниками на ГПХ
Как мы придумали стартап для застройщиков, потеряли единственного клиента, полностью изменились и теперь строим HR-платформу.
Всем привет, это сооснователь «Консоли» Михаил Провизион. Год назад мы с Виталием Поповым (основатель ПИК-Ремонт) решили создать решение для работы с внештатными исполнителями и уже в январе 2021 года начали обслуживать клиентов. Она помогает «Кухне на районе», «Додо Пицце» и еще десяткам компаний администрировать всех самозанятых, ИП и других подрядчиков.
Рассказываю, как устроена платформа, что мы планируем делать дальше и почему почти ничего не оставили от первой версии продукта.
Крупные компании всё чаще привлекают к выполнению заданий независимых исполнителей — это физлица на ГПХ, и ИП и конечно же, самозанятые. С введением нового налогового режима их количество уже перевалило за 2,4 млн человек. Мы наблюдаем беспрецедентную трансформацию рынка труда.
При этом жизнь заказчика наполнена рутинными операциями: нужно ставить исполнителям задачи, составлять и подписывать договора и акты и проводить платежи. А в случае с самозанятыми необходимо контролировать их постановку на учет и декларацию дохода в ФНС. Помимо рутины это влечет за собой риски: например, непризнания выручки в случае недостаточного подтверждения расходов. Когда внештатных исполнителей мало, администрировать их, хотя это все равно не самое веселое занятие, можно вручную. Когда их становится много, обычно больше ста, процессы приходится автоматизировать — тут уже без вариантов.
Раньше эту проблему помогали решить аутстаффинговые агентства. Они выступали агрегаторами для исполнителей и подрядчиками для компаний: передавали работников «в аренду», заботились о документах и денежных переводах. Но это дорого и не исключает человеческий фактор. Поэтому мы задались вопросом — можно ли заменить аутстаф IT-решением?
Гипотезу стали тестировать на управлении наемными строителями. Дело в том, что мой партнер Виталий Попов — сооснователь «ПИК-Ремонта». Он хорошо разбирался во внутренней кухне строительных компаний. Мы познакомились за год до старта «Консоли»: оба тогда уходили из проектов и искали что-то новое. В итоге договорились работать вместе и быстро нашли первого клиента. Мы разработали для него полноценную систему управления исполнителя и электронного документооборота. Через два месяца клиент «отвалился» по внутренним причинам.
Продукт получился специфическим: по крайней мере, не получилось быстро найти других клиентов. Поэтому решили не цепляться за конкретную реализацию и подумать, как ее можно трансформировать.
В итоге расширили целевую аудиторию и частично поменяли платформу: отказались от системы управления, но добавили автоматизацию по платежам и работе с самозанятыми. Стали появляться другие клиенты. Интересно, что среди них до сих пор нет ни одного застройщика.
Мы переписали изначальный продукт, сделали интеграцию с несколькими банками и с Федеральной налоговой службой. Так получили единое информационное пространство для компаний-заказчиков и исполнителей.
Сейчас платформа позволяет автоматизировать весь цикл взаимодействия с внештатниками — от оформления до выплат и уплаты налогов. Она может автоматически формировать все закрывающие документы, позволяет подписывать их электронной подписью. Платежи уходят автоматически как только исполнитель подписывает необходимый пакет документов. При этом за счет интеграций с бизнес-системой компании и бухгалтерией получается полностью устранить ручной труд на всех этапах.
Кроме того, мы научились работать с множеством различных трудоемких кейсов. Среди них:
поддерживаем исполнителей во всех статусах
В итоге мы ускоряем для компаний оформление, сокращаем издержки, делаем процессы прозрачными, снижаем риски.
Мы специализируемся на работе с крупными компаниями, которые сотрудничают с большим числом исполнителей и нуждаются в оптимизации и автоматизации этого процесса. Наша главная цель — сделать так, чтобы один менеджер мог администрировать 1 000 исполнителей, не привлекая кадры и бухгалтерию. И мы уже получаем хорошие результаты.
Например, франчайзи «Додо пиццы» с помощью «Консоли» вдвое сократили затраты на заключение договоров и сбор закрывающих документов. Еще они сэкономили время бухгалтеров — им больше не приходится вручную проверять сотни чеков и реквизитов. Стало легче жить и пяти сотням курьеров компании. Платформа теперь сама выписывает чеки и платит налоги.
Платформа помогает не только компаниям, но и исполнителям. С помощью личного кабинета они принимают задания и подписывают документы, или могут, например, в автоматическом режиме декларировать доходы. Недавно для самозанятых мы добавили сервис автоматической оплаты налогов в ФНС: он собирает данные обо всех поступлениях и дает возможность отложить необходимую сумму для оплаты.
Сегодня у нас около 100 клиентов. Компании покупают лицензию с доступом к продукту и выплачивают комиссию, если хотят использовать наше платежное решение. Выручка покрывает 50% от текущих издержек: через полгода планируем стать прибыльными. Еще готовимся работать с энтерпрайзом и уже запускаем пилоты для крупных корпоративных клиентов.
Про одну сложность на старте мы уже рассказали — про перестройку, которую мы прошли с первой идеей. Но мы понимали, что гибкость — хорошее качество для стартапа, и хотели развивать понятный и полезный продукт. Для этого нужно уметь анализировать ошибки и меняться.
Российский рынок решений для работы с независимыми исполнителями активно формируется. В планах «Консоли» — стать на нем лидером. Из сервиса для администрирования и автоматизации платежей мы хотим превратиться в полноценную HR-платформу, которая предоставляет полный спектр инструментов для эффективного взаимодействия заказчика и исполнителя. В первую очередь это возможность эффективно привлекать исполнителей — прямо на платформе. А также расширение финансовых инструментов: страхование и кредитование. Чтобы предложить клиентам больше возможностей, будем развивать сотрудничество с банками и партнерскую сеть.
Еще мы интересуемся мировыми рынками: планируем масштабироваться в Европу, изучаем зарубежные проекты и потенциальных конкурентов.
Консольная программа
Текстовый интерфейс пользователя (англ. Text user interface, TUI ; также Character User Interface, CUI ) — система средств взаимодействия пользователя с компьютером, основанная на использовании текстового (буквенно-цифрового) режима дисплея или аналогичных устройств — например, командная строка. Приложения, использующие текстовый интерфейс, называют консольными программами.
Содержание
Особенности текстового интерфейса
На программном уровне для ввода и вывода информации консольные программы используют стандартные устройства ввода-вывода (stdin, stdout, stderr), хотя могут открывать и другие файлы, сетевые соединения и совершать иные действия, доступные в выполняющей их среде. Вывод печатных символов в stdout и stderr приводит к появлению этих символов на устройстве вывода, то есть к их получению пользователем.
В простейшем случае консольная программа использует интерфейс командной строки, однако многие из таких программ с помощью управляющих последовательностей терминалов создают более дружественный интерфейс, приближающийся к графическому (см.: меню (информатика)).
Некоторые консольные программы пригодны лишь для определённой реализации текстового интерфейса, например, текстовые программы операционных систем, особенно библиотека
Реализация текстового интерфейса
В принципе, консольная программа не обязана заботиться о реализации самого взаимодействия с пользователем, ограничиваясь вводом-выводом на стандартные устройства, использованием библиотек типа программных интерфейсов. Собственно взаимодействие с пользователем обычно осуществляет операционная система или иное программное обеспечение.
Классической реализацией текстового интерфейса, восходящей к первой половине XX века, является алфавитно-цифровое устройство ввода-вывода, например, комплект из клавиатуры и АЦПУ (телетайпа). Впоследствии вместо АЦПУ стали применять мониторы, снабжённые знакогенератором, что позволило быстро и удобно организовывать диалог с пользователем. Подобными устройствами снабжён или может быть снабжён почти каждый современный компьютер. Такие комплекты из монитора и клавиатуры (иногда с добавлением мыши) называются консолью компьютера.
В соответствии с традицией использования консольными программами клавиатуры и АЦПУ для ввода и вывода соответственно взаимодействие таких программ с пользователем свелось к чтению из stdin и выводу на stdout. Таким образом, появилась возможность перенаправлять потоки ввода-вывода, осуществляя взаимодействие с пользователем посредством иных устройств, в том числе подключенных через сеть, а также при помощи специальных программ-эмуляторов терминала, например, рисующих окно с текстом в графическом интерфейсе пользователя (текстовое окно).
В 1970-х годы и позднее выпускались даже специальные устройства, реализующие текстовый интерфейс — текстовые терминалы, подключаемые через последовательный порт к компьютеру напрямую или через модем. С распространением персональных компьютеров функции текстового терминала, как правило, выполняет компьютер, тот, на котором выполняется консольная программа, или другой. Программы ssh (а также Интернет или локальную сеть. Программы konsole и многие другие реализуют текстовый интерфейс посредством текстового окна в среде X Window System.
Альтернативный подход к консольному выводу был использован в персональных компьютерах, в частности (хотя не только), IBM PC под управлением памяти, связанной со знакогенератором монитора, приводя к немедленному изменению видимых на мониторе данных. Такие программы могут также работать в среде Microsoft Windows. Более того, Windows имеет поддержку текстовых окон, во многом превосходящую имевшуюся в DOS, в том числе и для приложений собственно Windows.
Краткое введение в терминалы и консоль
Тут живут драконы и нет ментейнеров (вместо эпиграфа)
Очень сжатое боевое описание «что есть псевдо-терминал» и «консоль».
Итак, во-первых, определимся с тем, что такое консоль: консоль это программа, которая принимает от пользователя кнопки, а от соединения с компьютером — буквы на экран и спец. команды по рисованию картинки на экране.
Терминал — обобщённое название как программы, так и специальной железки (таких больше нет в природе). Особое исключение — когда вы запускаете путти или ещё кого-то для подключения к последовательному порту коммутатора/рутера/модема (или даже сервера), то вы выступаете (точнее компьютер с путти выступает) в роли терминала (название «терминал» — потому что терминирует кабель (то есть висит на самом конце) ).
Как легко понять по кабелю, есть два конца: терминал и то, что ему посылает байтики в кабель.
Когда запускается шелл, то он получает в своё распоряжение виртуальное устройство /dev/tty, которое у каждого процесса своё — это «обратная» часть терминала. Передняя часть в случае кабеля реализуется путти+компьютер, в случае консоли компьютера, специализированным ядерным драйвером (виртуальными консолями). Важно: драйвер эмулирует наличие терминала.
Существует интерфейс unix98 (/dev/ptmx), который позволяет создать парочку из «входа и выхода» для всех обратившихся программ. В этом случае одна половинка изображает из себя «обратную» половинку, а вторая — консоль. Используется, в частности, openssh’ем и x’овыми терминалками.
В этом месте много путаницы, но правило простое: с одной стороны тот, кто рисует, с другой — тот, кто говорит, что рисовать. С той стороны, с которой рисуют, с той же находится и пользователь с клавиатурой. Его данные поступают на противоположную сторону к программе.
В качестве самой частой программы со стороны «программы» выступает getty разных видов (mgetty, agetty и т.д.), задачей которой является выставление скорости работы канала и запуск команды login для ввода пароля.
В качестве передней части (рисующей байтики) выступает либо виртуальная консоль линукса, либо программа-терминалка (почти любая), либо находящийся за последовательным шнурком терминал (например, другой компьютер).
Каждое устройство по рисованию (терминал, виртуальная консоль и т.д.) имеют свой набор возможностей (поддерживаемых символов и команд). Тип терминала задаётся переменной TERM, но только в смысле, что он говорит программам, с каким терминалом они работают. Невозможно переменной TERM заставить терминал эмулировать другие терминалы — он про эту переменную ничего не знает.
Внезапное применение: KVM, XEN (и, я не уверен, но, кажется, OpenVZ) используют этот механизм для доступа к консоли виртуальных машин: в виртуальной машине создаётся специализированное устройство, взаимодействующее с демоном в dom0. С точки зрения domU — у него есть последовательное устройство для терминала. Чтобы на этом устройстве увидеть строчку login, нужно прописать в inittab строчку с вызовом getty и разрешить логин (/etc/securetty).
В dom0 демон видит последовательное устройство от domU, создаёт соответствующий псевдотерминал с помощью /dev/ptmx). Созданные устройства для подключения терминалов появляются в /dev/pts/*. Помимо этого consoled пишет в xenstore кому какой домен соответствует, специализированные терминалки (xenconsole) умеют это читать и выполнять. Когда даётся команда xl console (xm console), то она всего лишь вызывает xenconsole с заданным параметром.
Вместо xenconsoled можно использовать любую другую терминалку — хоть minicom, хоть cu, хоть socat, хоть putty. После подключения к консоли правильным является задать тип используемой консоли (set TERM=linux или set TERM=xterm, установка в vt100 даст чёрно-белый экран).
Это было очень сжатое и которое описание псевдотерминалов. Полное почти невозможно, ибо для полного понимания как это работает нужно начинать с телетайпов и устройства механических печатных машинок.
Основным моментом, который нужно осознать, является то, что в tty всегда есть два участника, один из которых умеет рисовать (сам, или выбрасывая содержимое на экран так, чтобы терминалка пользователя это нарисовала), а другой — даёт команды что рисовать и принимает последовательности нажатия кнопок.
Команды для работы с JavaScript-консолью в браузерах и повышение производительности труда программиста
Если вы занимаетесь веб-программированием, это значит, что вам не надо рассказывать о том, насколько в вашей работе важна отладка. Нередко для записи данных в логи, для их форматирования или вывода на экран используют внешние библиотеки, не учитывая при этом того факта, что в распоряжении программистов имеются JavaScript-команды для работы с консолями, которые встроены в браузеры. И обладают эти консоли гораздо более серьёзными возможностями, чем может показаться на первый взгляд.
Что такое консоль?
Консоль JavaScript — это механизм, интегрированный в современные браузеры, который поддерживает встроенные инструменты разработки в интерфейсе, напоминающем командную строку. С использованием консоли разработчик может делать следующее:
Методы console.log, console.error, console.warn и console.info
Использование различных команд для вывода данных в консоль
Метод console.group
В консоль, после выполнения этого фрагмента кода, попадёт следующее.
Группировка данных в консоли с помощью метода console.group()
Метод console.table
То, что получилось, и выглядит отлично, и способно облегчить отладку.
Табличное оформление выводимых данных с помощью console.table()
Методы console.count, console.time и console.timeEnd
А вот как выглядит результат работы этого кода в консоли.
Использование методов console.count(), console.time() и console.timeEnd()
Методы console.trace и console.assert
Несложно заметить, что вывод, генерируемый этим фрагментом кода, выглядит так же, как нечто подобное выглядело бы в React (или в любой другой библиотеке), когда фреймворк сообщает о возникновении исключения.
Результат использования команд console.assert() и console.trace()
Команды для работы с консолью и продакшн-код
Команды для работы с консолью нужны на этапе разработки и отладки приложений. Это значит, что когда придёт время выпуска продукта, эти команды придётся из кода удалить. Об этом можно просто забыть и, через некоторое время после сборки продакшн-версии проекта, заметить, что программа пишет что-то в консоль тогда, когда в этом нет никакой необходимости. Не стоит нагружать компьютеры ненужной работой, пусть и такой, казалось бы, незначительной, как вывод данных в консоль. В то же время, учитывая то, что команды для работы с консолью могут пригодиться в ходе доработки приложения, лучше всего не удалять их из исходного кода программы насовсем, а убирать их лишь из её продакшн-версии. Тут нам на помощь придут средства для сборки проектов. Так, я постоянно пользуюсь Webpack, и на работе, и в собственных проектах. Этот инструмент позволяет удалять все ненужные команды по работе с консолью (он способен отличить их от других команд) из продакшн-сборок с использованием uglifyjs-webpack-plugin.
Эта конфигурация очень проста, но она облегчает повседневную работу программиста и избавляет от проблемы забытых команд по работе с консолью.
Итоги
В этом материале мы рассказали о некоторых полезных командах для работы с консолью. Они позволяют, с помощью инструментов, являющихся частью современных браузеров, решать множество задач, которые сопутствуют разработке и отладке клиентских JavaScript-приложений.
Уважаемые читатели! Какие команды для работы с JavaScript-консолью вы используете?
Как «приручить» консоль, или 5 шагов к жизни с командной строкой
Всем привет! Меня зовут Осип, я Android-разработчик в Redmadrobot и я люблю автоматизировать всё, что автоматизируется. В этом мне помогает консоль, поэтому решил поделиться опытом, как настроить командную оболочку так, чтобы в ней было приятно работать и она ежедневно помогала вам решать задачи.
Статья для тех, кто использует Linux или macOS. Если у вас Windows, вы можете использовать WSL (приравнивается к Ubuntu).
Есть задачи, которые проще выполнить в командном интерфейсе, а не в графическом, к примеру:
посчитать количество строк кода в проекте,
«постучаться» в API и посмотреть какой ответ он выдаёт.
По опыту знаю: когда возникает одна из таких задач, разбираться, как это сделать в командной строке, если не используешь её — это последнее, чего хочется. Кажется, что нет смысла залезать в неё ради одной задачи. Проще найти плагин или утилиту.
Поверьте, стоит один раз настроить командную оболочку и разобраться, как в ней работать, и рабочее окружение начнёт помогать вам как хорошая IDE.
Обо всём по порядку, начнём с терминологии и пойдем дальше. Если вы уже знакомы с основами, можно переходить к разделу «Изучаем арсенал».
Статья только началась, а по тексту уже встречались и командная строка, и командная оболочка. Чем отличаются консоль, терминал, командная оболочка и командная строка?
Если объяснять «из центра наружу»: командная строка — строка, где пользователь пишет команды; командная оболочка — программа, которая интерпретирует команды, введённые в командную строку и выводит результат.
Термины «консоль» и «терминал» в статье используются как синонимы и обозначают программу для ввода и вывода информации. В терминале запускается командная оболочка.
В статье будут встречаться примеры команд. Если по ходу прочтения вы не понимаете, что делает консольная команда, скопируйте её и вставьте в ExplainShell. Благо «Роскомнадзор» перестал его блокировать после разблокировки Telegram.
Зачем вообще использовать командную строку
Дисклеймер: Я не призываю использовать только командную строку и отказаться от графического интерфейса. Нужно просто учитывать командную строку при выборе инструмента для решения задачи.
Доступность. Командная строка доступна везде. Внутри Android Studio есть вкладка с командной строкой. Можно и вовсе настроить «drop-down» терминал (ещё его называют «quake style»), который будет появляться поверх всех приложений по нажатию сочетания клавиш.
Многофункциональность. Одна точка доступа к любым утилитам.
Простота. Простой командный интерфейс может заменить сложный графический интерфейс. Сделать графический интерфейс который позволит ввести, например, пять параметров может быть довольно нетривиальной задачей, а сделать то же самое с командным интерфейсом — просто.
Легковесность. Как правило, CLI утилиты используют меньше ресурсов.
Меня как разработчика больше всего впечатляет, как можно комбинировать CLI утилиты. Текст — интерфейс общения, который понятен для всех утилит с командным интерфейсом. Утилиты принимают на вход текст и возвращают тоже текст. Это один из принципов Unix, которые сформулировал Дуглас Макилрой в 1978 году:
Пишите программы, которые делают одну вещь и делают её хорошо.
Пишите программы, которые бы работали вместе.
Пишите программы, которые поддерживают текстовые потоки, потому что это универсальный интерфейс.
Программы, которые соблюдают эти принципы, похожи на кирпичики. По отдельности они решают простую задачу, но их комбинации позволяют решать и сложные задачи.
Примеры из жизни
Я задал вопрос коллегам-роботам: «Для чего вы чаще всего открываете терминал?» Получился такой ТОП-5:
Работа с Git там, где не хватает графического интерфейса Git-клиента.
Установка пакетов и управление зависимостями (подробнее про менеджер пакетов поговорим в разделе «Устанавливаем менеджер пакетов»).
Проверка API с помощью curl.
Когда нужно «грохнуть» процесс.
Есть и менее очевидные применения:
Хотите посмотреть отличия между файлами? Выполните команду diff и укажите пути до файлов, которые надо сравнить.
Шаг 1: Открываем терминал
Не терминал, а эмулятор терминала. (c) Департамент зануд
Обычно в ОС уже есть какой-то терминал, и для начала можно использовать его. Если хочется больше функций и возможностей кастомизации, то есть из чего выбирать. Некоторые терминалы позволяют открывать вкладки, разделять экран и даже рендерить картинки. Можно найти на любой вкус, например, стилизованный под старый ламповый монитор.
cool-retro-terminal
Выбор терминала — это тема для отдельной статьи. Кратко: если у вас Linux, начните с этого списка. На macOS популярен iTerm2, но я его не использовал, поэтому не могу ни поругать, ни похвалить.
Для меня важно чтобы и на компьютере с Linux, и на рабочем ноутбуке с macOS был один и тот же терминал с одинаковыми настройками. Я выбирал среди кроссплатформенных и остановился на kitty.
Шаг 2: Устанавливаем менеджер пакетов
Мы оказались в терминале. Первое, с чем нужно разобраться, — менеджер пакетов.
Я встречал людей, которые уверены, что, для того чтобы установить программу из консоли, нужно непременно собирать её из исходников и вообще это сложно. Это не так. Программы в собранном виде хранятся в репозиториях. Пакетные менеджеры устанавливают программы из репозиториев и отвечают за их обновление и удаление.
Это даже проще, чем искать надёжный источник, из которого можно скачать программу, и удобнее, чем магазины приложений в macOS или Windows, где зачастую нет нужных программ.
Менеджеры пакетов в Linux
В дистрибутивах Linux менеджер пакетов есть по умолчанию. В Ubuntu, Debian и Mint это apt-get, а в Manjaro и ArchLinux — pacman.
В macOS придется установить пакетный менеджер. Самые популярные — Homebrew и MacPorts. Homebrew активнее поддерживается сообществом, а пакеты в нём обновляются чаще, поэтому лучше использовать его. Для установки скопируйте актуальную команду установки c официального сайта. Эта команда скачает скрипт установки и запустит его.
Может понадобиться установка «XCode Command Line Tools». Это базовый набор консольных инструментов — clang, git, make и других. Он не зависит от XCode, а называется так, потому что необходим XCode для компиляции.
Шаг 3: Устанавливаем командную оболочку
Чтобы было проще работать, командная оболочка должна вам помогать. В ней должен быть поиск по введённым ранее командам, а ещё должно работать автодополнение. Здорово, если будут подсказки, которые учитывают, какие команды вы используете чаще других. Не помешает подсветка синтаксиса и ошибок при вводе команд.
Установим fish c помощью менеджера пакетов:
В статье будут упоминаться и другие программы, все они устанавливаются таким же образом. Команды установки написаны на страницах программ, чтобы не повторяться, не буду писать их для каждой утилиты.
Fish установлен. Запускаем его командой fish :
Теперь можно настроить внешний вид. Команда fish_config откроет в браузере страницу настроек. Здесь можно настроить цветовую схему, приглашение командной строки (prompt), посмотреть список функций, переменные окружения, историю команд и список горячих клавиш. Здесь же можно добавлять, редактировать и удалять аббревиатуры команд. Про аббревиатуры поговорим чуть позже.
Fish по умолчанию
Закройте терминал и откройте его заново. Вы окажетесь не в fish, а в командной оболочке по умолчанию. Есть два варианта, как сделать так, чтобы открывался fish:
Использовать fish только как интерактивную оболочку.
Поиск по истории
Давайте-ка посмотрим, что умеет fish. Если еще не установили, можно попробовать в браузере. Я изменил только цвета и prompt, больше ничего не настраивал.
sample_command — это демонстрационная функция. Она принимает любые параметры и ничего не возвращает.
Автодополнение
Дополнение работает с командами, подкомандами и аргументами. Вместе с вариантами дополнения выводится описание подкоманд из документации.
А что с путями? Например, хотим перейти в папку dev/tools/jarjar/ :
Сложно запомнить все нужные флаги у команд. Хочу вывести дерево файлов, но не помню, как ограничить его глубину и сделать так, чтобы вывод был цветным. Для такого случая есть Shift + Tab — дополнение с поиском:
Автодополнение может сработать в самых неожиданных местах, например, так работает автодополнение для команды kill :
Убийство Android Studio на глазах у studentd
Wildcards
В fish, как и в bash, есть поддержка wildcards. Wildcards позволяют выполнить команду для нескольких файлов.
* — соответствует любой строке
** — соответствует любой иерархии папок, то есть рекурсивно заходит во вложенные папки
Применим wildcard, чтобы скопировать все файлы apk после сборки в папку output :
cp build/*.apk output/ — скопирует все apk из папки build.
cp build/**.apk output/ — скопирует все apk из папки build и из всех вложенных папок. То, что надо.
Функции, алиасы и аббревиатуры
Большиство команд fish это функции. Можно писать и свои функции. Синтаксис такой:
Если функцию нужно сохранить для будущих сессий, не забудьте выполнить команду funcsave [название] после того как напишете функцию и проверите, что она корректно работает.
Для часто используемых команд можно создать более короткие синонимы — алиасы. В fish команда alias создаёт однострочную функцию.
Как выглядит alias?
Другой вариант сокращения команд — аббревиатуры. Они настраиваются командой abbr или в fish_config во вкладке «Abbreviations».
Удобно создавать аббревиатуру одновременно в английской и русской раскладках (см. скриншот). Такая аббревиатура выполнится, даже если вы забыли переключить раскладку клавиатуры.
И па и gf превращается в git fetch
Шаг 4: Изучаем арсенал
Командная оболочка есть, теперь нужны команды.
Консольные утилиты могут быть с CLI и TUI. Command Line Interface (CLI) — программа принимает команды через командную строку. Так работает большинство утилит. Text User Interface (TUI) — интерфейс рисуется псевдографикой и по нему можно кликать мышкой как по GUI.
TUI для Spotify
Например, многие старые утилиты, которые выводят размер файла, по умолчанию выводят его в байтах. А утилита df вообще выводит свободное место на диске в количестве блоков по 512 байт.
Стандартные команды
Чтобы пользоваться командной строкой, нужно знать несколько стандартных команд:
cd [сhange directory] — команда для навигации по файловой системе. Если запустить её без аргументов, вы окажетесь в домашней папке;
cp [copy], mv [move], rm [remove] — команды для копирования, перемещения и удаления файлов, соответственно;
mkdir [make directory] — команда для создания папки;
echo — выводит строку, которую ей передали.
Помощь: man, help, tldr
Есть несколько способов получить справку по команде.
man — выводит полную справку:
список аргументов и описание каждого из них,
какие переменные окружения использует утилита и для чего,
советы и примеры использования,
другая информация, которую посчитал полезной разработчик.
Если читать мануалы некогда, то поможет утилита tldr. Она отображает типичные случаи использования команд:
tldr tldr
Объединяем команды
Помните, в самом начале я говорил, что консольные команды как «кирпичики» и их можно объединять, чтобы решить более сложную задачу? Сейчас мы этим и займёмся.
Синтаксис понятен, но таких команд не существует и запустить их у себя в консоли не получится. Давайте посмотрим на более реальный пример:
Современные утилиты
Просмотр списка файлов: ls, tree → exa
В exa по умолчанию включен цветной вывод и «человекопонятные» размеры файлов, есть поддержка широких экранов, отображается статус файлов в Git, если использовать команду в репозитории. Подробнее обо всех фичах читайте на сайте утилиты.
Скриншоты. Сравнение ls, tree и exa.
Бонус: В exa можно совместить два режима вывода.
Просмотр запущенных процессов: top → htop
top и htop. Обе утилиты выводят список запущенных процессов, но htop делает это гораздо приятнее.
В htop можно сортировать процессы по разным столбцам, нажимая на них. Кнопки в нижнем меню тоже нажимаются. Столбцы и информационные блоки в «шапке» настраиваются — можно убрать лишнее и добавить нужное.
А как выглядит top?
Работа с JSON: jq
jq — незаменимая утилита, если вы работаете с JSON. Проще показать на примерах что умеет делать jq.
Выкусываем из json’а только то, что нужно:
Это только малая часть возможностей. Все возможности смотрите в доке.
Другие утилиты
Чтобы этот раздел не раздулся, остальные утилиты я спрятал под спойлеры. При первом прочтении их можно пропустить и позже использовать этот раздел как справочник.
Консольный HTTP клиент: curl, wget → httpie
httpie делает то же что curl — отправляет запросы в сеть. Но посмотрите как отличается синтаксис и оформление вывода в curl и httpie.
На фотографии слева направо: curl и httpie
cat и bat выводят содержимое файла, но bat подсвечивает синтаксис и отображает изменения из гита.
ripgrep — более быстрая версия grep. Сравнение скорости работы показывает, что ripgrep быстрее всех 
Ещё одна утилита для поиска — fzf [fuzzy finder]. Это утилита с TUI для интерактивного поиска файлов с использованием нечёткого поиска по названиям.
Ещё из приятного — есть предпросмотр содержимого.
Стандартная утилита wc [word count] считает количество слов, символов и строк в файлах, но чтобы с помощью неё посчитать количество строк кода в проекте, придётся написать что-то такое:
У такой команды есть сразу несколько недостатков:
считаются все строки, включая комментарии и пустые строки,
сгенерированные файлы и остальные файлы, которые заигнорены в гите, тоже попадут в статистику,
такую команду долго писать.
Утилита tokei лишена перечисленных недостатков. Вот пример вывода tokei на одном из наших проектов:
Упс, файлы proguard засчитались в пользу Prolog
Хм, накопилось много врапперов и кэшей Gradle. Можно почистить.
Не верьте на слово, если я говорю, что одна утилита работает быстрее другой. Лучше проверьте.
Можно измерить время выполнения команды с помощью time (в macOS — gtime ). Эта утилита не предназначена для бенчмарков — нет возможности «прогрева», команда выполняется один раз. hyperfine подойдёт лучше, потому что изначально разработан для бенчмарков.
Попробуем замерить время выполнения команды tree :
Вывод команды tree перенаправлен в «пустоту» (/dev/null), потому что здесь не важен вывод команды, важно только время её выполнения. С hyperfine этого делать не нужно, он сам отбрасывает вывод команды.
Hyperfine умеет отслеживать признаки неправильного бенчмарка. Вот некоторые подсказки:
если во время замера есть выбросы, hyperfine посоветует закрыть другие программы, потому что они могут влиять на бенчмарк,
Можно сравнивать скорость выполнения нескольких команд. Для этого нужно написать команды друг за другом, заключив их в кавычки:
Шаг 5: Сохраняем настройки
Чтобы не настраивать каждый раз все программы заново, нужно где-то сохранять настройки.
Имена файлов и папок с настройками обычно начинаются с точки, поэтому одним словом их называют «dotfiles». На момент написания статьи на GitHub опубликовано 138 425 репозиториев с именем dotfiles — есть куда подсмотреть.
На странице awesome-dotfiles вы найдёте много информации про dotfiles. Там же есть ссылки на инструменты, которые помогают управлять dotfiles.
Я использую yadm. Мне важна кроссплатформенность, поэтому пригождается его возможность создавать альтернативные версии файлов для разных ОС.
Заключение
В консоли может быть сложно работать, если ее не «приручить». Но если выбрать удобную для себя командную оболочку и один раз ее настроить, то она будет постоянно помогать вам.
Чтобы не настраивать рабочее окружение на каждом новом компьютере заново, сохраняйте конфиги в Git-репозиторий. Но не забывайте о безопасности — следите, чтобы в репозиторий не попал ключи и пароли.
На замену старым утилитам приходят новые, нацеленные на пользователя, а не на скрипты. Используйте их и ищите новые! Если вам кажется, что утилита слишком сложная, возможно, вы такой не один и кто-то уже написал более простой в использовании аналог.
И самое главное — читайте документацию и исследуйте. Порой интересные возможности обнаруживаются у, казалось бы, полностью знакомых утилит.
Если будут вопросы или вам понадобится помощь с освоением консоли, пишите мне в Telegram @osipxd. Ещё я иногда пишу в канал @rareilly заметки про Android и вообще про всё интересное, что нахожу. Спасибо за внимание!

