Как «приручить» консоль, или 5 шагов к жизни с командной строкой

    Всем привет! Меня зовут Осип, я Android-разработчик в Redmadrobot и я люблю автоматизировать всё, что автоматизируется. В этом мне помогает консоль, поэтому решил поделиться опытом, как настроить командную оболочку так, чтобы в ней было приятно работать и она ежедневно помогала вам решать задачи.

    Статья для тех, кто использует Linux или macOS. Если у вас Windows, вы можете использовать WSL (приравнивается к Ubuntu).

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

    • посчитать количество строк кода в проекте,

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

    • «постучаться» в API и посмотреть какой ответ он выдаёт.

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

    Поверьте, стоит один раз настроить командную оболочку и разобраться, как в ней работать, и рабочее окружение начнёт помогать вам как хорошая IDE.

    Обо всём по порядку, начнём с терминологии и пойдем дальше. Если вы уже знакомы с основами, можно переходить к разделу «Изучаем арсенал».


    Статья только началась, а по тексту уже встречались и командная строка, и командная оболочка. Чем отличаются консоль, терминал, командная оболочка и командная строка?

    Если объяснять «из центра наружу»: командная строка — строка, где пользователь пишет команды; командная оболочка — программа, которая интерпретирует команды, введённые в командную строку и выводит результат.

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

    Подробнее о различиях можно почитать на Ask Ubuntu: What is the difference between Terminal, Console, Shell, and Command Line?

    В статье будут встречаться примеры команд. Если по ходу прочтения вы не понимаете, что делает консольная команда, скопируйте её и вставьте в ExplainShell. Благо «Роскомнадзор» перестал его блокировать после разблокировки Telegram.

    Зачем вообще использовать командную строку

    Дисклеймер: Я не призываю использовать только командную строку и отказаться от графического интерфейса. Нужно просто учитывать командную строку при выборе инструмента для решения задачи.

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

    • Доступность. Командная строка доступна везде. Внутри Android Studio есть вкладка с командной строкой. Можно и вовсе настроить «drop-down» терминал (ещё его называют «quake style»), который будет появляться поверх всех приложений по нажатию сочетания клавиш.

    • Многофункциональность. Одна точка доступа к любым утилитам.

    • Простота. Простой командный интерфейс может заменить сложный графический интерфейс. Сделать графический интерфейс который позволит ввести, например, пять параметров может быть довольно нетривиальной задачей, а сделать то же самое с командным интерфейсом — просто.

    • Легковесность. Как правило, CLI утилиты используют меньше ресурсов.

    Меня как разработчика больше всего впечатляет, как можно комбинировать CLI утилиты. Текст — интерфейс общения, который понятен для всех утилит с командным интерфейсом. Утилиты принимают на вход текст и возвращают тоже текст. Это один из принципов Unix, которые сформулировал Дуглас Макилрой в 1978 году:

    Пишите программы, которые делают одну вещь и делают её хорошо.


    Пишите программы, которые бы работали вместе.


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

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

    Примеры из жизни

    Я задал вопрос коллегам-роботам: «Для чего вы чаще всего открываете терминал?» Получился такой ТОП-5:

    1. Работа с Git там, где не хватает графического интерфейса Git-клиента.

    2. Установка пакетов и управление зависимостями (подробнее про менеджер пакетов поговорим в разделе «Устанавливаем менеджер пакетов»).

    3. Работа с SSH.

    4. Проверка API с помощью curl.

    5. Когда нужно «грохнуть» процесс.

    Есть и менее очевидные применения:

    1. Скачать видео из YouTube поможет youtube-dl. Качаете подкаст и нужна только аудио-дорожка? Добавьте к команде флаг --audio. Хотите скачать весь плейлист или даже весь канал? Подставляйте ссылку на канал и готовьте побольше свободного места.

    2. Хотите посмотреть отличия между файлами? Выполните команду diff и укажите пути до файлов, которые надо сравнить.

    Шаг 1: Открываем терминал

    Не терминал, а эмулятор терминала. (c) Департамент зануд

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

    cool-retro-terminal
    cool-retro-terminal

    Выбор терминала — это тема для отдельной статьи. Кратко: если у вас Linux, начните с этого списка. На macOS популярен iTerm2, но я его не использовал, поэтому не могу ни поругать, ни похвалить.

    Для меня важно чтобы и на компьютере с Linux, и на рабочем ноутбуке с macOS был один и тот же терминал с одинаковыми настройками. Я выбирал среди кроссплатформенных и остановился на kitty.

    Шаг 2: Устанавливаем менеджер пакетов

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

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

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

    Менеджеры пакетов в Linux

    В дистрибутивах Linux менеджер пакетов есть по умолчанию. В Ubuntu, Debian и Mint это apt-get, а в Manjaro и ArchLinux — pacman.

    Чтобы установить пакет достаточно в терминале написать apt-get install [package]. Если у вас pacman, то pacman -S [package]. Может понадобиться sudo в начале, чтобы выполнить команду с правами root.

    Чтобы обновить все пакеты с помощью apt-get введите команду apt-get update && apt-get upgrade. В pacman — pacman -Syu.

    В pacman много флагов и сложно сразу запомнить нужные. Ещё одно неудобство — он не поддерживает установку пакетов из репозитория AUR. Это репозиторий, в который могут загружать пакеты любые пользователи. Исправить минусы помогут утилиты, которые упрощают работу с pacman. Рекомендую попробовать yay.

    Менеджеры пакетов в macOS

    В macOS придется установить пакетный менеджер. Самые популярные — Homebrew и MacPorts. Homebrew активнее поддерживается сообществом, а пакеты в нём обновляются чаще, поэтому лучше использовать его. Для установки скопируйте актуальную команду установки c официального сайта. Эта команда скачает скрипт установки и запустит его.

    Может понадобиться установка «XCode Command Line Tools». Это базовый набор консольных инструментов — clang, git, make и других. Он не зависит от XCode, а называется так, потому что необходим XCode для компиляции.

    Теперь, чтобы установить пакет, достаточно в терминале написать brew install [package].

    Обновляются все пакеты одной командой — brew upgrade. Если brew отказывается работать, напишите brew doctor , и brew подскажет, что с ним не так, а также как это исправить.

    Шаг 3: Устанавливаем командную оболочку

    Чтобы было проще работать, командная оболочка должна вам помогать. В ней должен быть поиск по введённым ранее командам, а ещё должно работать автодополнение. Здорово, если будут подсказки, которые учитывают, какие команды вы используете чаще других. Не помешает подсветка синтаксиса и ошибок при вводе команд.

    Все примеры в статье будут сделаны с использованием командной оболочки fish. Эта командная оболочка проста для освоения и в ней все нужные функции работают «из коробки».

    Чтобы узнать, какая оболочка используется по умолчанию у вас, выполните команду echo $SHELL. Скорее всего, команда выведет /env/bash или /env/zsh — это самые популярные оболочки. Если хотите сравнить возможности bash, zsh и fish, посмотрите эту таблицу.

    Установим fish c помощью менеджера пакетов:

    # Если pacman
    sudo pacman -S fish
    
    # Если apt-get
    sudo apt-get install fish
    
    # Если brew
    brew install fish

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

    Fish установлен. Запускаем его командой fish:

    osip@homepc ~ % fish
    Welcome to fish, the friendly interactive shell
    Type `help` for instructions on how to use fish
    osip@homepc ~>

    Теперь можно настроить внешний вид. Команда fish_config откроет в браузере страницу настроек. Здесь можно настроить цветовую схему, приглашение командной строки (prompt), посмотреть список функций, переменные окружения, историю команд и список горячих клавиш. Здесь же можно добавлять, редактировать и удалять аббревиатуры команд. Про аббревиатуры поговорим чуть позже.

    Fish по умолчанию

    Закройте терминал и откройте его заново. Вы окажетесь не в fish, а в командной оболочке по умолчанию. Есть два варианта, как сделать так, чтобы открывался fish:

    1. Назначить fish командной оболочкой по умолчанию.

      Нужно учитывать, что скрипты инициализации текущей командной оболочки не будут выполняться. Команды и переменные окружения из .bashrc, .bash_profile, .zshrc и т.д, нужно переместить в .config/fish/fish.config , а затем адаптировать под синтаксис fish.

    2. Использовать fish только как интерактивную оболочку.

      Это более безболезненный способ, потому что не нужно мигрировать скрипты и переменные окружения. В конце скрипта инициализации текущей командной оболочки нужно запустить fish. Добавьте строку exec fish в файл .bash_profile, если у вас bash или в .zshrc, если zsh. Эти файлы находятся в корневой директории пользователя.

      На ArchWIki есть более подробное описание этого и еще нескольких способов.

    Поиск по истории

    Давайте-ка посмотрим, что умеет fish. Если еще не установили, можно попробовать в браузере. Я изменил только цвета и prompt, больше ничего не настраивал.

    Когда вы начинаете набирать команду, fish подсказывает команды и аргументы, которые вы использовали раньше. Чтобы применить подсказку нажмите . Подставить одно слово из подсказки — Ctrl+.

    sample_command — это демонстрационная функция. Она принимает любые параметры и ничего не возвращает.

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

    Автодополнение

    Начните писать любую команду и нажмите Tab, не дописывая её до конца. Попробуйте с командой git config:

    Дополнение работает с командами, подкомандами и аргументами. Вместе с вариантами дополнения выводится описание подкоманд из документации.

    Если утилита не поддерживает автодополнение, fish умеет создавать дополнения из документации man. Для этого нужно выполнить команду fish_update_completions.

    А что с путями? Например, хотим перейти в папку dev/tools/jarjar/:

    Дополнение путей тоже работает на Tab. Для перехода по пути не обязательно писать команду cd в начале. А еще работает дополнение, если написать первую букву имени каждой папки в пути. Если указан несуществующий путь, он подсвечивается красным.

    Сложно запомнить все нужные флаги у команд. Хочу вывести дерево файлов, но не помню, как ограничить его глубину и сделать так, чтобы вывод был цветным. Для такого случая есть Shift+Tab — дополнение с поиском:

    Автодополнение может сработать в самых неожиданных местах, например, так работает автодополнение для команды kill:

    Убийство Android Studio на глазах у studentd
    Убийство Android Studio на глазах у studentd

    Wildcards

    В fish, как и в bash, есть поддержка wildcards. Wildcards позволяют выполнить команду для нескольких файлов.

    Выводим все файлы с расширением .md в текущей папке
    Выводим все файлы с расширением .md в текущей папке

    * — соответствует любой строке
    ** — соответствует любой иерархии папок, то есть рекурсивно заходит во вложенные папки

    Применим wildcard, чтобы скопировать все файлы apk после сборки в папку output:

    • cp build/*.apk output/ — скопирует все apk из папки build.

    • cp build/**.apk output/ — скопирует все apk из папки build и из всех вложенных папок. То, что надо.

    Функции, алиасы и аббревиатуры

    Большиство команд fish это функции. Можно писать и свои функции. Синтаксис такой:

    function [название]
        [тело функции]
    end

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

    Для часто используемых команд можно создать более короткие синонимы — алиасы. В fish команда alias создаёт однострочную функцию.

    Как выглядит alias?

    Флаг --save указывает, что нужно автоматически вызвать команду funcsave после создания алиаса. Таким образом алиасы сохранятся для будущих сессий.

    Другой вариант сокращения команд — аббревиатуры. Они настраиваются командой abbr или в fish_config во вкладке «Abbreviations».

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

    Аббревиатуры подставляются «на лету», когда вы нажимаете Space или Enter. В отличие от алиасов, аббревиатуры не являются функциями.

    И па и gf превращается в git fetch
    И па и gf превращается в git fetch

    Шаг 4: Изучаем арсенал

    Командная оболочка есть, теперь нужны команды.

    Консольные утилиты могут быть с CLI и TUI. Command Line Interface (CLI) — программа принимает команды через командную строку. Так работает большинство утилит. Text User Interface (TUI) — интерфейс рисуется псевдографикой и по нему можно кликать мышкой как по GUI.

    TUI для Spotify
    TUI для Spotify

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

    Например, многие старые утилиты, которые выводят размер файла, по умолчанию выводят его в байтах. А утилита df вообще выводит свободное место на диске в количестве блоков по 512 байт.

    Чтобы выводились понятные человеку размерности, нужно добавить флаг -h (human readable). Цветной вывод удобнее читать, но он тоже по умолчанию обычно отключен и включается добавлением флага, чаще всего -C. В современных же утилитах по умолчанию включен цветной «человекопонятный» вывод.

    Стандартные команды

    Чтобы пользоваться командной строкой, нужно знать несколько стандартных команд:

    • cd [сhange directory] — команда для навигации по файловой системе. Если запустить её без аргументов, вы окажетесь в домашней папке;

    • cp [copy], mv [move], rm [remove] — команды для копирования, перемещения и удаления файлов, соответственно;

    • mkdir [make directory] — команда для создания папки;

    • echo — выводит строку, которую ей передали.

    Если команда долго работает и вы не хотите дожидаться её завершения, прервите её выполнение сочетанием клавиш Ctrl + C.

    Помощь: man, help, tldr

    Есть несколько способов получить справку по команде.

    man — выводит полную справку:

    • описание команды,

    • список аргументов и описание каждого из них,

    • какие переменные окружения использует утилита и для чего,

    • известные баги,

    • советы и примеры использования,

    • другая информация, которую посчитал полезной разработчик.

    Если ввести man man, вы получите справку по команде man, где всё это подробно описано.

    man — это утилита с TUI, в ней есть горячие клавиши. Для поиска нажмите /, а для выхода q. / и q — стандартные клавиши для поиска и выхода, они работают во многих TUI утилитах. Ещё один стандартная клавиша — ?, она открывает справку.

    Можно выполнить команду из man — для этого нажмите ! и введите команду. Хотите открыть man для другой команды внутри man или сразу попробовать выполнить команду, следуя документации? Легко.

    Страницы в man пишут разработчики утилит. Если разработчик не написал справку, man выдаст «No manual entry for [command]». Но даже если нет страницы в man можно вывести краткую справку с помощью флага --help. Попробуйте написать man --help.

    Для команд fish можно открыть справку в браузере командой help <command>.

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

    tldr tldr
    tldr tldr

    Объединяем команды

    Помните, в самом начале я говорил, что консольные команды как «кирпичики» и их можно объединять, чтобы решить более сложную задачу? Сейчас мы этим и займёмся.

    Чтобы направить вывод одной команды на вход другой, используется оператор |. Он называется pipe, а на русский его переводят как «конвейер». Если мы хотим подать вывод команды find_bone на вход команде eat, нужно между этими командами поставить «трубу» (pipe):

    $ find_bone | eat

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

    $ echo -e "spot\\nhandle\\npick\\natlas" > robots.txt
    $ cat robots.txt | sort
    atlas
    handle
    pick
    spot

    Оператор | нам уже знаком, но что делает >? Этот оператор направляет вывод команды в файл. После этого командой cat мы достаём содержимое файла и с помощью оператора | отдаём на сортировку.

    Современные утилиты

    Просмотр списка файлов: ls, tree → exa

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

    В exa по умолчанию включен цветной вывод и «человекопонятные» размеры файлов, есть поддержка широких экранов, отображается статус файлов в Git, если использовать команду в репозитории. Подробнее обо всех фичах читайте на сайте утилиты.

    Скриншоты. Сравнение ls, tree и exa.
    Сравнение вывода ls и exa
    Сравнение вывода ls и exa
    Сравнение вывода tree и exa
    Сравнение вывода tree и exa

    Бонус: В exa можно совместить два режима вывода.

    Просмотр запущенных процессов: top → htop

    top и htop. Обе утилиты выводят список запущенных процессов, но htop делает это гораздо приятнее.

    В htop можно сортировать процессы по разным столбцам, нажимая на них. Кнопки в нижнем меню тоже нажимаются. Столбцы и информационные блоки в «шапке» настраиваются — можно убрать лишнее и добавить нужное.

    А как выглядит top?

    Работа с JSON: jq

    jq — незаменимая утилита, если вы работаете с JSON. Проще показать на примерах что умеет делать jq.

    Валидируем json:

    $ echo '{"model": spot}' | jq type
    parse error: Invalid numeric literal at line 1, column 15
    
    $ echo '{"model": "spot"}' | jq type
    "object"

    Форматируем json:

    $ echo '{"model":"spot"," type":"robodog"}' | jq
    {
      "model": "spot",
      "type": "robodog"
    }

    Выкусываем из json'а только то, что нужно:

    $ set json '[{"model": "spot", 
    "type": "robodog"}, {"model": "atlas", "type": "humanoid"}]'
    
    $ echo $json | jq 'map(.model)' --compact-output
    ["spot","atlas"]
    
    $ echo $json | jq .[0].model
    "spot"
    
    # А теперь пример посложнее
    $ echo $json | jq 'map({(.model): .type}) | add'
    {
      "spot": "robodog",
      "atlas": "humanoid"
    }

    Это только малая часть возможностей. Все возможности смотрите в доке.

    Другие утилиты

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

    Консольный HTTP клиент: curl, wget → httpie

    httpie делает то же что curl — отправляет запросы в сеть. Но посмотрите как отличается синтаксис и оформление вывода в curl и httpie.

    На фотографии слева направо: curl и httpie
    На фотографии слева направо: curl и httpie

    Отображение содержимого файла: cat → bat

    cat и bat выводят содержимое файла, но bat подсвечивает синтаксис и отображает изменения из гита.

    Поиск по содержимому файлов: grep → ripgrep

    ripgrep — более быстрая версия grep. Сравнение скорости работы показывает, что ripgrep быстрее всех :)

    Поиск файлов: find → fd, fzf

    Для поиска файлов можно использовать стандартную утилиту find. Для неё есть альтернатива — fd. Она работает быстрее, поддерживает цветной вывод, по умолчанию игнорирует скрытые файлы и файлы из .gitignore. Посмотрите на гифку, которая демонстрирует работу fd.

    Ещё одна утилита для поиска — fzf [fuzzy finder]. Это утилита с TUI для интерактивного поиска файлов с использованием нечёткого поиска по названиям.

    Ещё из приятного — есть предпросмотр содержимого.

    Подсчёт количества строк кода: wc → tokei

    Стандартная утилита wc [word count] считает количество слов, символов и строк в файлах, но чтобы с помощью неё посчитать количество строк кода в проекте, придётся написать что-то такое:

    $ fd -g '*.kt' | xargs wc -l

    У такой команды есть сразу несколько недостатков:

    • считаются все строки, включая комментарии и пустые строки,

    • ищутся только файлы с расширением .kt, для поиска других придётся менять команду,

    • сгенерированные файлы и остальные файлы, которые заигнорены в гите, тоже попадут в статистику,

    • такую команду долго писать.

    Утилита tokei лишена перечисленных недостатков. Вот пример вывода tokei на одном из наших проектов:

    Упс, файлы proguard засчитались в пользу Prolog
    Упс, файлы proguard засчитались в пользу Prolog

    Свободное место на диске: du → ncdu

    Ещё один пример разницы CLI и TUI. В отличие от du, ncdu это TUI. Тут же можно перейти внутрь папки или удалить ненужное нажав d.

    Хм, накопилось много врапперов и кэшей Gradle. Можно почистить.
    Хм, накопилось много врапперов и кэшей Gradle. Можно почистить.

    Сравнение файлов: diff → delta

    Отличная замена старому-доброму diff - delta. Можно использовать режим отображения side-by-side, если больше нравится, включить отображение номеров строк. Даже без дополнительных настроек диффы выглядят приятно:

    Измерение времени работы программы: time → hyperfine

    Не верьте на слово, если я говорю, что одна утилита работает быстрее другой. Лучше проверьте.

    Можно измерить время выполнения команды с помощью time (в macOS — gtime). Эта утилита не предназначена для бенчмарков — нет возможности «прогрева», команда выполняется один раз. hyperfine подойдёт лучше, потому что изначально разработан для бенчмарков.

    Попробуем замерить время выполнения команды tree:

    Вывод команды tree перенаправлен в «пустоту» (/dev/null), потому что здесь не важен вывод команды, важно только время её выполнения. С hyperfine этого делать не нужно, он сам отбрасывает вывод команды.

    Hyperfine умеет отслеживать признаки неправильного бенчмарка. Вот некоторые подсказки:

    • если во время замера есть выбросы, hyperfine посоветует закрыть другие программы, потому что они могут влиять на бенчмарк,

    • если первый запуск команды дольше остальных, hyperfine посоветует сделать «прогрев», задав параметр --warmup N. Перед бенчмарком программа выполнится N раз.

    Можно сравнивать скорость выполнения нескольких команд. Для этого нужно написать команды друг за другом, заключив их в кавычки:

    $ hyperfine 'command_one' 'command_two' 'command_three'

    Шаг 5: Сохраняем настройки

    Чтобы не настраивать каждый раз все программы заново, нужно где-то сохранять настройки.

    Конфиги — это файлы. Обычно они хранятся в корневой директории пользователя вместе со скриптами инициализации командной оболочки, например, в папке .config/. Если вы установили fish, то найдёте папку .config/fish/ и в ней файлы с настройками. Самый простой способ сохранить конфиги — сохранить их в Git-репозиторий.

    Имена файлов и папок с настройками обычно начинаются с точки, поэтому одним словом их называют «dotfiles». На момент написания статьи на GitHub опубликовано 138 425 репозиториев с именем dotfiles — есть куда подсмотреть.

    На странице awesome-dotfiles вы найдёте много информации про dotfiles. Там же есть ссылки на инструменты, которые помогают управлять dotfiles.

    Я использую yadm. Мне важна кроссплатформенность, поэтому пригождается его возможность создавать альтернативные версии файлов для разных ОС.

    Заключение

    В консоли может быть сложно работать, если ее не «приручить». Но если выбрать удобную для себя командную оболочку и один раз ее настроить, то она будет постоянно помогать вам.

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

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

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

    Если будут вопросы или вам понадобится помощь с освоением консоли, пишите мне в Telegram @osipxd. Ещё я иногда пишу в канал @rareilly заметки про Android и вообще про всё интересное, что нахожу. Спасибо за внимание!

    Что ещё почитать

    Redmadrobot
    №1 в разработке цифровых решений для бизнеса

    Комментарии 33

      +1
      На КДПВ: вообще-то не speak, a say!

        +3
        Для картинки нужна была несуществующая команда :)
        P.S Не знал, что для say можно ещё и голос выбрать, спасибо за ссылку
        +3

        Вот есть у нас консоль по UART транспорту. На удаленной системе только подмножество стандартных команд (какой-нибудь урезанный xxxxbox). Удаленная система readonly
        SSH нет. Как удобнее гонять файлы из/в? Только средствами самой консоли и базовых команд.

          +1
          Спасибо за вопрос. Есть возможность использовать netcat?
            0

            Сети нет, только UART

            0

            Если на железке реализована поддержка X-Modem (чаще всего) или Y-Modem / Z-Modem(протоколы передачи файлов по модемному соединению и последовательному интерфейсу), то реализации под линукс есть. А чем вы на железку ходите? Какой программой? И да, если там ФС смонтирована в RO, то записать разумеется ничего не сможете, если конечно нет возможности перемонтировать ФС в RW.

              +1
              Зависит от базовых команд. Проще всего — X/Y/Z-modem. Если нет — копипастой hex-дампа (xxd) / base64.
              +1
              Отличная статья, спасибо!
              Взял себе пару утилит.
                0
                Консоль это всего лишь интерфейс к тому или иному софту, то что визуальные инструменты как правило неполноценны по функционалу это другая история.
                  +2
                  За spotify-tui отдельный мегареспект.
                  Пользовался cmus, но хотелось что-то для Spotify!
                    0

                    Вот так, начитается кто-нить таких статей, а потом попадёт на сервер, где никакого fish, совместимого исключительно с самим собой, и прочих хипстерских утилит отродясь не было и всё… приплыли! ;-)

                      +2

                      Согласен, будет неприятно, но лучше чем если человек вовсе не знаком с консолью.
                      Я хочу заинтересовать людей, которые не хотят пользоваться консолью из-за того, что им некомфортно. Тут ведь как. Вошёл во вкус и вот сам не заметил как поставил себе i3 и пишешь скрипт на каждый блок в статусной строке :)

                        0

                        Так есть-же совместимые, с POSIX шеллы, при этом очень дружелюбные к пользователю. Тот-же Zsh, да даже баш, при большом желании, можно заточить до юзабельного сосстояния.

                          0

                          bash и zsh отличные шеллы, но для статьи между вариантами "поставьте fish" и "поставьте zsh и oh-my-zsh, потом поставьте плагин zsh-autosuggestions, настройте вот это и вон то" я выбрал первый.
                          Fish можно попробовать "бесплатно" — не тратя время на настройку. Не зашло — выкинул, настроил другой шелл. Если не настраивал, то и выкидывать не жалко.
                          Главное, чтобы читатель увидел какие фичи вообще бывают и тогда он при желании сможет настроить их и для других оболочек.

                            +1

                            Полгитхаба готовых конфигов zsh. Как раз на попробовать. ;-) Зато потом как втянешься — за уши не оттащишь!

                          +1
                          Вошёл во вкус и вот сам не заметил как поставил себе i3 и пишешь скрипт на каждый блок в статусной строке :)

                          Чтобы поставить себе i3, нужно сначала обкатать шелл с плюшками? Мне это всё как-то странно. С одной стороны, люблю, скажем, i3 + rofi + conky + terminator/bash + screen, с другой — fancy-шеллы, mc и разные ranger-ы так и не зашли. Максимум, бывает удобно походить по директориям через vim, когда нужно одновременно редактировать несколько файлов. Никакой особой непродуктивности не чувствую. Если учесть, что при постоянной необходимости набирать какие-то очень длинные и трудно запоминаемые команды, проще превратить их в короткие через скрипт, используя текстовый редактор (а для более сложных ситуаций с ещё большей вероятностью скорее используется текстовый редактор), то не очень понятно, зачем нужны плюшки. Больше похоже, что всё это чисто дело вкуса. Автодополнение из man сначало прозвучало интересно, потом вспомнил, что и так захожу в man почитать о каком-то параметре при неуверенности, и происходит это довольно быстро, главное время уходит на чтение.


                          P.S. Пока это писал, пришла мысль, что меня всё равно интересуют всякие плюшки. Просто я не сисадмин, и меня интересуют плюшки не шелла, а IDE. :)

                            0
                            Чтобы поставить себе i3, нужно сначала обкатать шелл с плюшками? Мне это всё как-то странно.

                            Зависимость не прямая, но у меня примерно так и было


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

                            Чтобы знать об их существовании и использовать если понадобится :) Вы уже нашли комфортное для себя окружение, а плюшки могут быть полезны тем кто его только ищет.

                        0

                        top у них не красивый ;-)… А если help...


                        почитать?

                        top во всей красе

                          0

                          К сожалению, клавиша z в top на macOS ничего не делает, да и в целом в этой версии топа довольно мало функций


                          Вот всё что есть


                          А вот если linux, то действительно можно добавить цветов.

                            0

                            Как всё грустно в этом вашем маке… ;-)

                          +1
                          Как любитель консоли, линукса и всего лампового позволю себе не согласиться с автором. Вот мои минусы, которые я бы обозначил:
                          1) настройка «под себя» это первый гвоздь в гроб пользователя, это отчасти работает если кроме пары настроенных ПК вы ничем не пользуетесь, а когда у вас например 600 стандартных ПК, то у вас есть только та консоль, что уже установлена
                          2) если умирает какой-то проект на который вы подсели, то будет ломка, я не хочу ломки
                          3) консоль требует очень-очень хорошей памяти, которой например у меня нет и я быстрее всё сделаю «стрелочками» в FAR/NC чем вспоминая команды и их формат в консоли.
                            0

                            Спасибо за комментарий. Попробую ответить.


                            1) настройка «под себя» это первый гвоздь в гроб пользователя, это отчасти работает если кроме пары настроенных ПК вы ничем не пользуетесь, а когда у вас например 600 стандартных ПК, то у вас есть только та консоль, что уже установлена

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


                            2) если умирает какой-то проект на который вы подсели, то будет ломка, я не хочу ломки

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


                            3) консоль требует очень-очень хорошей памяти, которой например у меня нет и я быстрее всё сделаю «стрелочками» в FAR/NC чем вспоминая команды и их формат в консоли.

                            Наверное я не до конца понял. Вы имеете в виду только работу с файлами в этом пункте? Если так, то это не противоречит статье. Возможно, стоит добавить ещё один спойлер с файловыми менеджерами :)

                              +1
                              1) безусловно, но лучше я буду в мире встречать ПК со стандартной консолью и понимать как ей пользоваться, чем ограничу себя двумя ПК — дома и на работе. Ну не будете же вы ставить и настраивать консоль на ноутбуке друга чтобы настроить ему сеть?
                              2) Это как в мире Линукса сидеть на OS/2, и длина жизни проекта не поможет, да и сообщество может увести проект не туда куда вам нужно. В любом случае это зависимость.
                              3) Я вообще о факте удержания в памяти всего набора консольных команд. Ну и в остальном — а что кроме файлов вы вообще на ПК можете обрабатывать — это же современная парадигма вычислительной техники, файл — её атом. Консоль на любой вопрос в вашей голове требует запроса команды в консоли явно, то есть вы не можете просто посмотреть на разные части экрана и получить информацию. Кому-то безусловно может нравится набивать миллионы команд для простейших операций, но я не считаю это разумным. Поэтому для меня примерно такая последовательность действий на ПК:
                              Проводник
                              FAR
                              PShell
                              В 99% случаев я не выхожу за рамки FAR.
                              Для примера давайте я прокомментирую ваш топ-5:
                              Я задал вопрос коллегам-роботам: «Для чего вы чаще всего открываете терминал?» Получился такой ТОП-5:
                              1. Работа с Git там, где не хватает графического интерфейса.
                              2. Установка пакетов и управление зависимостями (подробнее про менеджер пакетов поговорим в разделе «Устанавливаем менеджер пакетов»).
                              3. Работа с SSH.
                              4. Проверка API с помощью curl.
                              5. Когда нужно «грохнуть» процесс.

                              1) Я даже не в курсе что у Git есть GUI
                              2) FAR
                              3) putty
                              4) не в курсе что это, видимо тоже запущу FAR
                              5) Ctrl+Alt+Del, Диспетчер задач, Снять задачу — это примерно в 857564653 быстрее чем искать PID и потом его снимать. Кстати у FAR есть окно со списком задач и можно даже снять неугодную, но это еще дольше чем Диспетчер задач.
                              Из перечисленного я ничего не делаю никогда, но важность консоли для меня от этого не меньше. На мой взгляд консоль — это отдельный инструмент, как например УШМ и реноватор — могут многое делать одинаково, но всё же задачи у них разные.
                              Я ни в коем разе не против ваших доводов, я просто несколько озадачился вашим акцентом на то, что консоль — это мана небесная.
                                0
                                в продолжении темы об отсутствии универсальности — у меня дома нет ничего чтобы кастомизировало Windows, как нет и на работе ни на одном ПК, при этом я работаю одновременно от WinXP до Win10 с равной производительностью, а коллеги постоянно чертыхаются 10-ки, а те кто подсел на 10 — ничего не могут сделать на 7. Для меня это странно.
                                  0

                                  Хотел бы просто отметить, что на линуксах pid искать не обязательно и можно грохнуть процесс по имени одной командой))
                                  А вообще — дело вкуса и ситуации, как по мне. Если консоль уже открыта — зачем запускать еще какую-то стороннюю утилиту, если можно парой команд выполнить поставленную задачу)

                                    0
                                    можно грохнуть процесс по имени одной командой))

                                    только в том случае если вы знаете то самое имя

                                      +2

                                      Это довольно странно, если вы хотите грохнуть "ну вот это вот, не знаю как называется"

                                      0

                                      Процессы игр из Steam сначала смотрю в ps, а потом:


                                      ps aux | grep -i 'something' | tr -s ' ' | cut -d' ' -f2 | xargs kill -9

                                      Понимаю, что извращение, и что можно использовать killall -9 -I -r 'something', но пока вспоминаю об этом, уже заканчиваю набирать… :)

                                      0
                                      Это как в мире Линукса сидеть на OS/2

                                      Два года назад окончательно перелез с OS/2 на линуксы, при этом из под полуоси эти самые линуксы прекрасно админил… Эх, опять я что-т делаю не так.


                                      Я вообще о факте удержания в памяти всего набора консольных команд.

                                      Не нужно держать в голове весь набор консольных команд, но основные команды, хотя-бы из набора iproute2 / coreutils можно запомнить. А то это напоминает поведение младшекласника, типа я не хочу учить азбуку, это-ж буквы запоминать надо. А из этих букв, (о ужас!) ещё и слова составлять ;-)


                                      а что кроме файлов вы вообще на ПК можете обрабатывать — это же современная парадигма вычислительной техники, файл — её атом

                                      Не везде. Кое где основной парадигмой является объект, например. А обрабатывают обычно данные. Файл это контейнер, которого может и не быть… curl https://bla-bla-bla/ | jq blablabla самый яркий пример отсутствия файла в процессе обработки.


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

                                      Как это не могу?


                                      Могу

                                      image


                                      Проводник
                                      FAR
                                      PShell
                                      В 99% случаев я не выхожу за рамки FAR.

                                      Проводник, FAR, Pshell… О чём вообще речь? Нет, конечно, если сидеть под виндой, то консоль неудобна. С этим я согласен на все сто. Только не надо примерять пользовательские паттерны windows на *nix-like системы.


                                      Проверка API с помощью curl.
                                      не в курсе что это, видимо тоже запущу FAR

                                      Спасибо, посмеялся. Заряд хорошего настроения на день обеспечен. :-)

                                        0
                                        Не нужно держать в голове весь набор консольных команд

                                        надеюсь вы понимаете что все люди разные? или нет?
                                        я если не пользуюсь чем-то неделю, то только man/google с повторением и примерами

                                        Не везде

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

                                        Как это не могу?

                                        А текст выше вы руками написали или он сам появился? Как вы узнали что нужно именно png изучать? перед этим у вас еще будет ls -la, а только когда выдача вас устроит вы будете писать команду с новым фильтром и никак иначе.

                                        Нет, конечно, если сидеть под виндой, то консоль неудобна

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

                                        Только не надо примерять пользовательские паттерны windows на *nix-like системы

                                        а когда беседа перешла в русло unix-like only?

                                        Спасибо, посмеялся

                                        надеюсь вы в курсе что такое FAR, а то ваш смех странноват и вы действительно выглядите смешно.
                                        обхохочемся ))))
                                        image
                                  +2

                                  пробовал fish
                                  в итоге ушёл на zsh + ohmyzsh, обратная совместимость с bash оказалась важнее

                                    +1

                                    Ничего не имею против zsh + ohmyzsh, но отвечу для тех кто тоже столкнётся с проблемой совместимость fish и bash.


                                    Если использовать fish только как интерактивную оболочку, боль от отсутствия обратной совместимости минимизируется.
                                    Иногда возникаю проблемы, что копипаста со stackowerflow или какой-то скрипт не работает (потому что в нём нет shebang), но тут есть варианты как это исправить.


                                    1. Если команда простая, её можно адаптировать под синтаксис fish.
                                    2. Всегда остаётся вариант выполнить команду через bash:
                                      $ bash script.sh              # Запускаем скрипт в bash
                                      $ bash -c 'your command here' # А теперь команду
                                    3. Если учитывать решения с плагинами, можно попробовать fish.reply
                                      0

                                      Один вопрос… «Зачем пытаться хлебать суп китайскими палочками, когда можно спокойно есть ложкой»? ;-)

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое