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

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

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

Тебе нужно натыкаться на неизведанное.

- Фрэнк Гери

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

Что такое оболочка?

Есть два типа скорлупы. GUI (графический интерфейс пользователя) - это то, что многие люди привыкли видеть. Это окна, с которыми мы взаимодействуем каждый день, будь то браузер, медиаплеер или текстовый редактор. CLI (интерфейсы командной строки) - это интерфейсы, ввод и вывод которых состоят только из текста. Хотя оба технически являются оболочками, слово «оболочка» обычно подразумевает интерфейс командной строки. Интерфейсы командной строки позволяют нам быть предельно конкретными в наших командах. У них меньше уровней абстракции от ОС, что обычно означает, что их вывод более информативен, чем их аналоги с графическим интерфейсом.

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

Эмуляторы терминала

Перво-наперво, давайте добавим потенциал в наш терминал, заменив его другим эмулятором. Стандартный терминал Mac хорош и все такое, но может быть немного жестким. Эмуляторы терминала позволяют нам взаимодействовать с оболочками на (частично) наших условиях. Они дают нам возможность настраивать среду, чтобы мы могли сосредоточиться на том, что мы хотим сделать с помощью терминала. В основном я взаимодействовал с двумя эмуляторами: iTerm2 и Hyper.

Гипер

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

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

iTerm2

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

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

Сбор ракушки

Есть две основные оболочки, с которыми я взаимодействовал: Bash и ZSH.

Баш

Bash, или Bourne Again SHell, был создан для замены оболочки Bourne, отсюда и броское название. Это гораздо более часто используемая оболочка из двух, стандартная оболочка GNU, любимая пользователями Linux во всем мире. По сути, разница между Bash и ZSH невелика. Тем более, что их испытает более случайный пользователь. Поскольку он мог хранить историю сеанса и иметь качественный отзыв команд, он быстро стал популярным в качестве замены sh. Он существует уже почти 30 лет и, естественно, выпал на роль «оболочки по умолчанию».

ZSH

Хотя bash - самая популярная оболочка, мы будем использовать zsh. Это тоже расширенная версия оболочки Bourne. Однако он также обладает множеством функций, которые придают ему преимущество. Построенный через год после появления Bash, он имел менее популярную жизнь. Однако он имеет многие из тех же функций. Я бы сказал, что самая интересная особенность - это поддержка тем и плагинов. Это дает ему наибольший потенциал в качестве инструмента обучения. Чтобы установить его, откройте iTerm2, получите homebrew (отличный менеджер пакетов) и установите его. Вот более подробные инструкции по настройке.

О мой зш

Чтобы получить еще больший уровень контроля, нам понадобится Oh My Zsh, «восхитительная платформа с открытым исходным кодом, управляемая сообществом для управления вашей конфигурацией Zsh». В нем также есть набор отличных тем, для чего мы и будем его использовать. Вы можете установить его с помощью:

curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh

.zshrc

Чтобы настроить наши параметры, нам необходимо внести изменения в файл .zshrc, который был создан при установке zsh. Вы найдете его по адресу ~/.zshrc. Этот сценарий запускается в начале каждого сеанса оболочки, который у нас есть. Отсюда сеансы получают все свои конфигурации zsh. Вот где мы сделаем первое изменение конфигурации. В верхней части файла вы увидите:

# Set name of the theme to load. Optionally, if you set this to "random"
# it'll load a random theme each time that oh-my-zsh is loaded.
# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
ZSH_THEME="agnoster"

Как и в примере, установите ZSH_THEME на agnoster. Теперь ваш терминал должен выглядеть так (с разными цветами):

Теперь перейдем к цветам. Загрузите и импортируйте цветовые схемы iterm, вот, как это сделать. После загрузки перейдите в настройки - ›профиль -› цвета. В правом нижнем углу вы увидите раскрывающееся меню, из которого вы можете выбрать цвета. Я использую afterglow, но, очевидно, вам решать, что вы выберете. Итак, теперь мы стилизовали наш эмулятор, давайте добавим погоду в нашу командную строку.

Командная строка

Командная строка - это строка текста, которая выполняет каждую из наших команд в оболочке. Он обновляет каждую команду и предлагает нам набрать текст. Также полезно предоставить некоторую базовую информацию. Обычно это текущая позиция пользователя или, возможно, его ветка Git. Как уже упоминалось, мы добавим сюда погоду, потому что ... почему бы и нет. Прежде чем мы начнем, нам понадобится доступ к открытому API погоды. Это простой и бесплатный сервис, который мы можем использовать для получения информации о погоде в определенной области. Для этого зарегистрируйтесь здесь. После того, как ваша учетная запись настроена и вы вошли в систему, вы можете получить свой API_KEY здесь. Приготовьте свой ключ для копирования и вставки в ближайшее время.

Следующее, что вам нужно сделать, это добавить следующую строку под экспортом в .zshrc.

autoload -Uz add-zsh-hook

Давайте быстро разберемся с этим. autoload отмечает, что имя является функцией, а не внешней программой. -U обозначает функцию add-zsh-hook для автозагрузки. Автозагрузка - это возможность автоматически загружать и связывать части программы, когда это необходимо, так что от нас не требуется явно определять или включать ее. -z означает использование стиля zsh (а не ksh). Но что такое ZSH-крючок, спросите вы? Лучше всего это описывает документация.

Некоторые функции являются специальными для оболочки, как описано в разделе Специальные функции, Функции, поскольку они автоматически вызываются в определенных точках во время выполнения оболочки. У каждого есть связанный массив, состоящий из имен функций, которые должны быть вызваны в одной и той же точке; это так называемые функции перехвата. Функция оболочки add-zsh-hook обеспечивает простой способ добавления или удаления функций из массива.

Итак, по сути, мы загружаем add-zsh-hook и помечаем его как функцию для дальнейшего использования. Далее мы создадим нашу функцию для получения и хранения данных о погоде.

get_weather() {
  weather=$(curl -s "api.openweathermap.org/data/2.5/weather?q={INSERT_CITY_HERE}&APPID={INSERT_API_KEY_HERE}" \
  | jq '.weather[0].description?')
  # Remove suffix quote
  weather="${weather%\"}"
  # Remove prefix quote
  weather="${weather#\"}"
  # Capitalise string
  weather=`sed 's/\(.\)/\U\1/' <<< "$weather"`
  # Store in txt file
  echo "$weather" > ~/weather.txt
}

Как видите, получение и сохранение данных не занимает много времени. Первое, что мы сделаем, это загрузим его с помощью curl. cURL - это URL-адрес клиентской программы. Следовательно, «c» для клиента и URL: cURL. По сути, это инструмент для обработки любых передач по интернет-протоколу. В нашем случае это очень полезно, поскольку позволяет нам создавать HTTP-запросы. Итак, как видите, мы запускаем функцию, используя curl для хранения наших данных о погоде в переменной с именем weather. Параметр -s, который мы используем в начале строки, просто переводит curl в беззвучный режим. Поскольку мы хотим, чтобы это работало в фоновом режиме, нам не нужно видеть какие-либо индикаторы выполнения, которые идут с curl запросами. В тихом режиме они удаляются. Затем у нас есть наш URL-адрес, на который мы хотим curl отправить запрос. Я пометил, где вам нужно поместить свой ключ API в URL-адрес, с помощью {INSERT_API_KEY_HERE}. Я также пометил место, где вы должны вставить свой город, с помощью {INSERT_CITY_HERE}.

После этого вы можете видеть, что мы используем \, чтобы разбить команду на новую строку, а затем |, чтобы передать ей другую команду. Канал позволяет нам в основном направлять вывод одной команды на ввод другой. Здесь мы передаем наш HTTP-ответ из curl в jq. jq, как описано в его собственной документации:

… Как sed для данных JSON - вы можете использовать его для нарезки, фильтрации, сопоставления и преобразования структурированных данных с той же легкостью, что sed, awk, grep и другие позволяют вам играть с текстом.

Вам нужно будет скачать и установить его здесь. Почти там! Теперь мы используем jq для извлечения свойства description из ответа WeatherAPI следующим образом:

jq '.weather[0].description?'

Мы переходим к свойству weather ответа с помощью .weather, а затем, поскольку это массив, получаем доступ к его первому свойству с помощью [0]. Внутри этого мы берем свойство description. ? - необязательный параметр. Это означает, что если с ответом что-то не так и эта индексация не работает, jq просто ничего не выдаст. Последние части функции просто форматируют строку, чтобы удалить кавычки, которые заключают все свойства с JSON, а также использовать строку с заглавной буквы. Наконец, мы используем:

echo “$weather” > ~/weather.txt

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

add-zsh-hook precmd get_weather

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

Теперь заключительная часть. Размещение этих данных в приглашении. Для этого вам нужно открыть ~/.oh-my-zsh/themes/agnoster.zsh-theme. Внутри вы заметите набор функций с префиксом prompt, таких как prompt_git, который обрабатывает все прекрасное отображение данных Git. Мы собираемся создать здесь нашу собственную функцию подсказки. Сразу под prompt_git давайте создадим новую функцию приглашения под названием prompt_weather. Это будет выглядеть так:

prompt_weather() {
  weather=`cat ~/weather.txt`
  prompt_segment red white
  echo -n $weather
}

Это очень просто. Он использует cat для извлечения текстовых данных из нашего текстового файла и сохраняет их в переменной. Сокращенно от concatenate, cat считывает данные из файла и выдает их содержимое в качестве вывода. Мы используем prompt_segment red white, чтобы указать цвета нашего приглашения для темы agnoster. Наконец, мы выводим нашу переменную. Внизу файла вы увидите функцию под названием build_prompt(). Это отвечает за объединение всех данных приглашения вместе. Добавьте нашу новую функцию prompt_weather в наименьшее количество других функций подсказок, например:

## Main prompt
build_prompt() {
  RETVAL=$?
  prompt_status
  prompt_virtualenv
  prompt_context
  prompt_dir
  prompt_git
  prompt_weather // Here's our new function
  prompt_bzr
  prompt_hg
  prompt_end
}

Давайте удостоверимся, что вся эта прекрасная новая функциональность действительно есть в нашей оболочке, выбрав ее с помощью source ~/.zshrc. Отлично, теперь, когда наш .zshrc загружает тему, эта новая функция будет добавлена ​​в приглашение. Наконец, запустите оболочку и войдите. Поздравляю! Погода теперь должна отображаться в командной строке!

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