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

Опубликовано: 2022-03-11

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

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

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

Иллюстрация: инструменты командной строки и хакерство в фильмах выглядят круче, чем в жизни

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

Однако в реальном мире инструменты командной строки используются не в развлекательных целях.

Почему мы до сих пор используем инструменты интерфейса командной строки

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

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

Стоит знать, что терминальный инструмент может предлагать несколько типов интерфейсов. Есть неинтерактивные, такие как ls, которые просто принимают параметры и предоставляют вывод. В менеджерах пакетов чаще всего встречаются интерактивные или полуинтерактивные интерфейсы. («Вы уверены, что хотите продолжить установку из непроверенного источника?») Кроме того, существуют текстовые пользовательские интерфейсы (TUI), которые представляют собой интерактивные приложения с графическим интерфейсом, разработанные с учетом ограничений терминала. Наверное, самый известный из них — Midnight Commander (mc), клон крайне популярного (в 90-х) Norton Commander.

Основные инструменты командной строки

Если вы хотите стать консольным жителем, вам нужно вооружиться минимальным набором инструментов разработчика командной строки — самым необходимым. Вещи, без которых вы определенно не можете жить, — это интерактивная оболочка (стремитесь к чему-то современному с удобным завершением табуляции) и текстовый редактор .

Иллюстрация: основные инструменты командной строки

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

  • Относитесь ко всему как к файлу.
  • Делайте только одно дело, но делайте это хорошо.
  • Чтение из стандартного ввода, запись в стандартный вывод и передача ошибок в стандартный поток ошибок.
  • В случае успеха вернуть код 0. Ненулевое значение означает ошибку (что можно определить по точному коду возврата).
  • Разрешить цепочку команд и сценарии.

Оболочка

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

Исторически сложилось много разных видов снарядов. Среди самых популярных были csh (C Shell) и различные реализации Bourne Shell (обычно известные как sh ). Bourne Shell расширился до Korn Shell, который также набрал обороты и до сих пор используется его энтузиастами. В настоящее время Csh является оболочкой по умолчанию в некоторых системах BSD, в то время как почти все другие UNIX-подобные операционные системы предпочитают ту или иную оболочку Bourne. Дистрибутивы Linux, как правило, отдают предпочтение bash, в то время как в Mac OS X по умолчанию используется zsh.

Есть и другие возможности, но они гораздо менее популярны, за исключением Microsoft PowerShell в системах Windows. PowerShell частично вдохновлен интерактивными оболочками UNIX, такими как zsh, и частично средой выполнения .NET. Вместо того, чтобы рассматривать все как текст, концепция, распространенная в мире UNIX, позволяет объектно-ориентированное манипулирование данными.

Несмотря на то, что Microsoft PowerShell довольно популярен в среде Windows, многие программы с происхождением из UNIX (наиболее заметными из них являются Git, Autotools или Make), как правило, предпочитают некоторые варианты Bourne Shell. Из-за этого родились такие проекты, как msys (в комплекте с Git для Windows), Cygwin или недавний WSL от Microsoft. Если вы хотите, чтобы в Windows вы чувствовали себя как в Linux, MSys — лучший выбор. Если вам нужна полнофункциональная среда Linux, способная запускать стандартные бинарные файлы Linux, тогда вам подойдет WSL. Для чего-то среднего — API UNIX, но скомпилированного как исполняемый файл Windows (используйте его только тогда, когда вы действительно знаете, зачем вам это нужно) — Cygwin — это ответ.

редактор

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

Иллюстрация: редактор командной строки имеет простой интерфейс

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

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

Основные текстовые редакторы

Среди простых текстовых редакторов наиболее распространенным является GNU Nano. На самом деле это клон редактора pico, поэтому, если в вашей системе нет одного, вы можете попробовать другой. Другая, более современная альтернатива обоим — это микроредактор. Если вы хотите что-то простое и в то же время расширяемое, это хорошее место для начала.

Программируемые текстовые редакторы

Многие разработчики полагаются на программируемые редакторы из разных лагерей, такие как Vim и GNU Emacs. Оба редактора могут работать в консоли или в режиме графического интерфейса, и оба повлияли на привязки клавиш, найденные в другом программном обеспечении. Оба они предлагают не только API, но и встроенные языки программирования. Emacs ориентирован на LISP, а Vim использует собственный VimL, ​​но также предлагает интерфейсы для других популярных языков сценариев (таких как Lua, Perl, Python или Ruby). Также стоит упомянуть более новый подход к Vim, названный Neovim, так как он начинает приобретать серьезных поклонников.

Это может несколько сбивать с толку, но существует также редактор под названием vi, который является предшественником Vim (что, кстати, расшифровывается как « Vi i m proof»). Это намного проще, чем Vim, но если у вас достаточно уверенности, чтобы писать в Vim, вам не составит труда использовать vi.

Поскольку pico/GNU Nano и vi/Vim обычно предустановлены в различных системах, было бы неплохо хотя бы понять их основы (известно, что выход из Vim — сложная проблема для новичков). Таким образом, если вам нужно что-то отредактировать на удаленной машине, вы будете готовы независимо от того, какой редактор уже там. На своем личном устройстве вы можете использовать любой удобный для вас редактор.

Системный редактор по умолчанию

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

Переменная среды $EDITOR указывает на редактор по умолчанию, и в Bourne-совместимых оболочках (sh, bash, ksh, zsh) вы можете увидеть его, введя echo $EDITOR . Если значение отличается от вашего личного выбора, вы можете установить его самостоятельно, добавив export EDITOR=my-awesome-editor в конфигурацию среды выполнения вашей оболочки ( ~/.profile , ~./bashrc , ~/.zshrc и т. д.).

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

Мультиплексор

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

В этом вам может помочь терминальный мультиплексор. Говоря о мультиплексорах, некоторые сразу предполагают, что речь идет о GNU Screen. Это был первый широко распространенный инструмент такого рода, который до сих пор очень популярен (часто устанавливается по умолчанию). Его современная заменаtmux , что неудивительно означает «терминальный мультиплексор».

Эти два позволяют вам открывать более одного окна в данном сеансе терминала и свободно переключаться между этими сеансами. Они позволяют разбивать окна на панели, что помогает запускать несколько приложений одновременно и наблюдать за их выводом в режиме реального времени (без переключения окон). Кроме того, они работают в режиме клиент-сервер, что означает, что вы можете отсоединить их в любой момент и вернуться позже, чтобы продолжить работу с того места, на котором остановились. Эта последняя функция привела к популярности Screen, когда людям нужны были постоянные сеансы IRC.

В большинстве случаев вам подойдут GNU Screen или tmux, но если по какой-то причине вы считаете, что они слишком требовательны к ресурсам, есть и более легкие альтернативы. Есть dtach/atach и есть abduco. Они намеренно ограничены в возможностях, но могут хорошо выполнять свои обязанности.

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

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

Чтобы упростить процесс установки программного обеспечения, создатели операционных систем придумали концепцию менеджеров пакетов. Проще говоря, менеджер пакетов похож на магазин приложений для CLI и настольных приложений. Он опережает настоящие магазины приложений на несколько десятилетий. Проблема в том, что почти в каждой системе есть свой менеджер пакетов. Debian, Ubuntu и производные дистрибутивы GNU/Linux используют APT, дистрибутивы на основе Red Hat предпочитают yum или DNF, другие дистрибутивы Linux имеют более экзотические способы установки программного обеспечения, как и различные клоны BSD. Помимо встроенных менеджеров пакетов, существуют также устанавливаемые пользователем, такие как Chocolatey для MS Windows и Homebrew для Mac OS X/macOS. Если вы хотите написать инструкции по установке вашей программы, вы можете написать кейсы для каждой из этих систем. Кажется, что это слишком, не так ли?

К счастью, последняя из упомянутых систем, Homebrew, может быть самой переносимой благодаря Linuxbrew, порту Homebrew для систем GNU/Linux. Самое смешное, что он работает даже на WSL, если вы хотите иметь аналогичный пользовательский интерфейс в Microsoft Windows. Имейте в виду, что WSL официально не поддерживается.

Итак, кроме портативности, что еще может предложить Homebrew? Во-первых, это не мешает системным пакетам, поэтому все, что вы устанавливаете, находится на отдельном уровне операционной системы. Кроме того, для установки пакетов обычно не требуются права root. Таким образом, вы можете иметь стабильные и проверенные системные пакеты, но в то же время проверять их новые версии, не жертвуя стабильностью системы.

Если вы хотите протестировать редакторы, я упоминал ранее, что все, что вам нужно сделать в системе с Homebrew или Linuxbrew, — это запустить эту команду:

brew install emacs micro nano vim neovim .

Блестящие вещи

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

Интерактивный фильтр

Поиск в истории команд может быть утомительным. Хотя и bash, и zsh поддерживают сочетание клавиш Ctrl+R, они показывают только одну замену за раз. Более того, вам нужно ввести точный текст, который вы использовали ранее. Поскольку это довольно распространенная операция, как только вы начнете использовать командную строку, она станет отличным местом для улучшения.

Интерактивные фильтры, такие как fzy, percol, peco или fzf, помогают фильтровать длинные строки текста. Это может быть либо вышеупомянутая история команд, все строки кода в каталоге проекта, либо список имен файлов, сгенерированный find . . Общая идея здесь состоит в том, чтобы сначала представить вам все доступные строки, а затем полагаться на алгоритмы нечеткого поиска, чтобы отфильтровать все, что не соответствует.

Например, привязка Ctrl+R к fzf показывает список самых последних команд, по которым можно перемещаться вверх и вниз с помощью стрелок, или вы можете ввести git , чтобы отобразить только те команды, в которых есть Git где-то внутри. Лично я, когда работаю с оболочкой, не имеющей интерактивного фильтра, внезапно чувствую себя немного потерянным. Эта функция действительно привлекательна!

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

Интерактивный навигатор

Facebook PathPicker здорово помог мне, когда я работал в основном с проектами на C++. Журнал ошибок, сгенерированный компилятором, может стать довольно большим и довольно неприятным, и возможность найти фактические пути внутри этого журнала была благом для производительности.

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

Пользовательский интерфейс Git

Скорее всего, по крайней мере один из проектов, над которыми вы работаете, использует Git в качестве системы контроля версий. Будучи полностью мощным, Git CLI не является вершиной превосходного пользовательского опыта. Чтобы избавить вас от стресса при чтении всех параметров в справке Git $SUBCOMMAND , я рекомендую вам проверить tig. Он предлагает приятный консольный пользовательский интерфейс для операций, которые от него выигрывают, таких как log или blame .

Еще один инструмент, призванный помочь пользователям GIt, — это fac, сокращение от Fix All Conflicts . Как вы могли догадаться, это удобно, когда вы сталкиваетесь с конфликтами при выполнении слияний или перемещений. Это альтернатива другим инструментам слияния, таким как vimdiff.

Файловый менеджер

Было время в 90-х, когда все хотели двухпанельный файловый менеджер. Тенденция началась с Norton Commander. Многие другие пошли по тому же пути, но Midnight Commander до сих пор пользуется стабильной пользовательской базой. Самый очевидный вариант использования — использование mc для управления локальными файлами, но он также очень полезен при работе с удаленными машинами.

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

Инструменты CLI просто для удовольствия

«Полная работа и отсутствие игр делают Джека скучным мальчиком», — говорят они. Есть много программ, командной строки и прочего, которые служат только для вашего развлечения. Видеоигра Rogue попадает в эту категорию. Это даже дало название целому жанру игр! Другими популярными игрушками являются удача и ковбой, которые могут сделать ваш день немного менее скучным, если вы используете их где-нибудь, например, в своих сценариях CI.

Но для некоторых из нас главная привлекательность использования консоли в первую очередь заключается в том, чтобы почувствовать себя хакером в кино. No More Secrets и Hollywood Hacker хорошо представляют эту группу. Попробуйте, когда кто-то наблюдает за вашей работой, и ваш хакерский авторитет обязательно возрастет!

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

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

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

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

Возможность добавлять псевдонимы также способствует выигрышу. Например, я часто создаю коммиты в Git, обновляя один и тот же, пока он не станет идеальным (на данный момент). Как только я подготовлю нужные файлы, я запускаю git carmh . Не пытайтесь найти это в руководстве, так как это мой личный псевдоним, означающий commit --amend --reuse-message=HEAD . Это точно экономит набор текста.

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

Дальнейшие исследования

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

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

У большинства приложений с графическим интерфейсом есть терминальный аналог. Сюда входят веб-браузеры, почтовые клиенты, чат-клиенты (IRC, Slack, XMPP), пакеты PIM или электронные таблицы. Если вы знаете какие-либо хорошие программы, которые я не упомянул, поделитесь ими в комментариях.