Вступление
Всем привет! Данная серия статей — это текстовый вариант моего доклада на WSD в Киеве 26 ноября. Решил написать, чтобы дать более развернутое описание темам, которые были затронуты, а некоторые моменты уточнить. Кроме того, есть возможность рассмотреть больше примеров, услышать мнение от тебя, уважаемый читатель. И, конечно же, поделиться информацией с более широкой аудиторией.
План побега
- Менеджеры терминалов. Часть первая
- Менеджеры терминалов. Часть вторая
- Скрипты на bash
- Автоматизация рутинных задач
Важный момент. Предполагается, что читатель уже имеет опыт работы с терминалом на *nix OS. В примерах используется много утилит, таких как
grep, find, xargs, echo, sed
, и другие. На этих утилитах я не буду останавливаться подробно. Также нет задачи рассмотреть все и вся. У нас большая команда и я часто вижу как одну и ту же задачу люди выполняют по-разному. Это также касается и работы в терминале. Знакомьтесь — это IE6.
Представьте себе ситуацию, что ваш любимый браузер не умеет работать с вкладками. Более того, когда он закрывается в самый неподходящий момент, вы не можете восстановить сессию и продолжить работу.
А вот так большинство пользователей представляют себе терминал. Черный экран, белые символы.
А теперь представьте, что в ваш любимый браузер добавили возможность работать в терминале. В нем вы можете выполнять команды
git, npm, node
и многие другие. Звучит как что-то нереальное из будущего. А вот и нет.И в этой серии статей я хочу показать, что терминал может быть удобным и многофункциональным, только нужно знать как это все приготовить.
И так, приступим. Какие темы рассмотрим? Рассмотрим менеджеры терминалов. Потом скрипты на bash. И последнее, это как автоматизировать рутину с помощью скриптов на bash.
Репозиторий
Для удобства я создал репозиторий на github со всеми примерами и темами, которые будем рассматривать на протяжении всей серии статей. Так что можно скачать и попрактиковаться.
Слайды
Доступны по этой ссылке. Презентация сделана на движке shower.
Где это все работает
Это все работает на Windows 10 stable, Mac OS X, Ubuntu. Предпочтение отдается Ubuntu. Все примеры я буду показывать в Ubuntu. Также есть классный эмулятор терминала — это ConEmu. Правда, в нем не получится попробовать менеджеры терминалов.
Менеджеры терминалов. Часть первая. Screen
Начнем со screen’а. Познакомился я с ним совершенно случайно. Коллега помогал мне в решении одной задачи. И он увидел, что я не пользуюсь менеджером терминалов. Тогда он сказал: «Хм, давай поправим это.» Установил мне screen, помог настроить и показал парочку базовых сочетаний клавиш.
Установка
Чтобы установить screen достаточно выполнить первую команду. После этого можно будет его запустить, набрав команду screen в терминале.
Базовые сочетания клавиш
Почему я не выводил весь список в статью, а добавил ссылку?! Все просто. Во-первых, они есть в мануале (
man screen
). Во-вторых, их не нужно учить, запоминать или еще что-то там, просто нужно начать использовать.Настройки
По умолчанию screen настроен не очень удобно. У него даже нет строки состояния. Выводится сообщение о лицензии и еще некоторые неудобства. Все это можно поправить с помощью файла конфигураций. Разместить его нужно в домашней директории пользователя.
screen в деле
Давайте рассмотрим screen в работе. Как его запустить мы уже знаем. Достаточно набрать screen. Перед этим не забудьте поместить файл настроек в домашнюю директорию пользователя.
- Рабочая область. Layout.
- Строка состояния. На ней размещаются вкладки и другие элементы.
- Вкладка с именем по умолчанию.
Мы рассмотрели начальное состояние screen’а. Давайте теперь рассмотрим его на примере более сложной задачи.
Для этого нам понадобится репозиторий, о котором я упоминал выше. Давайте его склонируем себе на компьютер:
git clone https://github.com/var-bin/terminalForCoder__WSD.git
Далее запустите screen. Нам понадобится 2 — 3 вкладки. Чтобы создать новую вкладку нужно нажать следующие сочетания клавиш:
Ctrl + a, c - создать новую вкладку
Следующим шагом будет переименование вкладок. Для этого используйте:
Ctrl + a, A - переименовать вкладку
Чтобы переключаться между вкладками воспользуйтесь этими клавишами:
Ctrl + a, int - переключиться на нужную вкладку (int - номер вкладки 0 - 9)
Или
Ctrl + a, " - интерактивное переключение вкладок
С вкладками немного попрактиковались. Теперь давайте разобьем наш текущий регион на два независимых региона. Делается это с помощью сочетания клавиш:
Ctrl + a, | - разбить текущий регион на два новых по вертикали
Чтобы во втором регионе была возможность работать, в него нужно перейти и активировать явно. Сделать это можно с помощью:
Ctrl + a, Tab - переключить фокус на следующий регион
Ctrl + a, c - создать новую вкладку
Теперь давайте запустим в том регионе, что слева, к примеру, midnight commander (любую другую утилиту) с помощью команды:
mc
А в том регионе, что справа, запустим наше тестовое приложение. Это простой чат, написанный на node.js и socket.io. Этот пример взят с официального сайта socket.io. Единственное, что я добавил — это немного логирования, чтобы мы видели что оно работает. Для этого нужно перейти в директорию
%repoName%/screen/chat-example
. И выполнить команды:npm i
node index.js
%repoName%
— имя директории в которую был склонирован репозитой.Если все хорошо, то вы должны увидеть на экране строку:
listening on localhost:3000
После этого запустите браузер и в новой вкладке перейдите по адресу
localhost:3000
. Наберите любое сообщение в строке ввода и нажмите Enter
. Как видите, все работает и вы видите это сообщение также и в терминале. В том регионе, где выполняли команду node index.js
.И теперь, самое интересное. Давайте сымитируем обрыв связи. Закроем терминал через крестик. Но при этом не закрывайте браузер. И попробуйте отправить еще несколько сообщений. Как видите, все продолжает работать. Это при том, что мы только что закрыли терминал.
Это говорит о том, что screen сохранил сессию и все процессы, которые были запущены. Давайте подключимся к этой сессии обратно. Запустите терминал и выполните команду:
screen -r
Как вы могли заметить, тот layout, который мы создавали раньше, он не сохранился. Это довольно неприятный сюрприз. В настройках screen’a есть команды, которые позволяют настроить сохранение ранее созданного layout’а. Но сколько я не пробовал у меня не завелось. И это ситуация когда у нас две-три вкладки. А представьте себе картину, когда у нас шесть-десять вкладок. Layout разбит на регионы как по вертикали так и по горизонтали. И в самый неподходящий момент у нас происходит обрыв связи. Единственный плюс — это то, что все запущенные процессы сохранятся.
Я долгое время работал без менеджеров терминалов по одной простой причине. Я о них не знал! Считал, что это нормально открывать несколько окон putty (windows + подключение к удаленному серверу) и переключаться между ними с помощью сочетания клавиш
Alt + Tab
. И как-то пытаться во всем этом хаосе работать.Теперь о плохом. screen не умеет создавать layout для каждой вкладки. Также screen не умеет сохранять layout, если оборвалась связь или еще что-то там. До версии 4.1 не умел делать разбивку по вертикали (для меня это критично). Когда вы создаете новый регион, то в нем отдельно нужно создавать новое окно (
Ctrl+a, c
), выполнить переход в нужную директорию и т.д. Чтобы удалить регион тоже нужно помучиться Ctrl+a :remove
. Для меня screen был как глоток свежего воздуха посреди мегаполиса. Но чтобы его настроить «под себя», нужно потратить немало времени. И некоторые хотелки так и не получилось запилить в виду ограниченности реализации screen.Подведем краткий итог. Мы рассмотрели один из популярных менеджеров терминалов, а именно screen. Также мы рассмотрели как его установить, настроить. На примере рассмотрели screen в работе. Еще раз хочу напомнить: если нужно посмотреть какие сочетания клавиш за что отвечают, какие настройки можно еще задать для screen’а, какие можно передавать опции в качестве аргументов screen’у, и многое другое, то выполните команду:
man screen
Забегая немного наперед, в следующей статье мы рассмотрим более продвинутый менеджер терминалов, а именно tmux. Также сравним screen и tmux.
На этом все. Спасибо за внимание. Кто дочитал до конца отдельное спасибо. До встречи в следующей статье.
Комментарии (42)
iroln
14.12.2016 14:46+1без screen'а у вас недоступна возможность работы с вкладками в терминале
Может глупость спрошу, но "открыть новую вкладку" в окне стандартного терминала, например, в Ubuntu — это не работа с вкладками? Или тут "вкладка" в терминале — это нечто большее чем просто вкладка в окне терминала? Ну, например, сохранение сессий, восстановление вкладок и т. д.?
var_bin
14.12.2016 14:51Добрый день.
Ждал этого вопроса =). Да, согласен, что вкладками никого не удивишь. Тут именно вся соль в том, что screen умеет сохранять сессии, процессы, восстанавливать вкладки, разделять layout на несколько независимых регионов и много других полезных мелочей. В статье про tmux кроме всего прочего будет показано, как настроить сохранение сессий для ssh. Если оборвалась сессия, то он все сохраняет и не требует повторного ввода пароля. Как это может быть со стандартным терминалом.snp
15.12.2016 08:37+2Какого ещё пароля? Вы ещё ssh ключами не пользуетесь что ли? 2017 год уже на носу.
var_bin
15.12.2016 11:28Добрый день.
Да, нужно было уточнить. Опять же, при работе через putty. Если происходит обрыв связи, даже, при соединении по ssh. При следующем подключении к сессии, неважно, screen, tmux или еще что-то там, то без дополнительной магии терминал, вас вежливо попросит ввести пароль. И нужно будет перезапустить сессию заново.RubyFOX
27.03.2017 10:39Ну я так вообще небольшой 3D-принтер собирал, а там питание через нормальные драйвера шли 4988, питание естественно должно быть с запасом.
alexkuzko
14.12.2016 16:25Автору может быть интересен screenie. Визуализирует сессии.
var_bin
14.12.2016 17:50Добрый день.
Спасибо за совет. Пробовал, довольно интересно. Интерактивная надстройка над screen'ом. Если и начинать им пользоваться, то уже после того, как достаточно долгое время используешь screen. А то будет слишком много магии =)
Sirikid
14.12.2016 19:34Почему скрипты именно на bash?
var_bin
14.12.2016 20:16Добрый вечер.
Спасибо за вопрос. Все просто — в 99% когда вы садитесь за компьютер, который работает на *nix подобных OS, оболочка по умолчанию, которая обрабатывает команды пользователя будет bash. Конечно, есть еще такая оболочка как zsh, но это уже совсем другая история.Sirikid
14.12.2016 21:31+1Ну да, 99%, но ведь есть ещё оставшийся 1%. И bash не стандартизирован, лично я считаю что стоит писать скрипты на POSIX sh, потому что он стандартизирован и есть миллион различных совместимых реализаций.
gre
14.12.2016 21:25+1Для тех, кто работает под linux — есть terminator.
Совершенно внезапно он умеет обходится без кучи putty окон, а разбиение окон очень быстро делается в процессе работы.
Из минусов — в моём случае потребовалось изменить прямо в исходнике применение клавиш мышки (говорят, что в свежей версии у автора есть требуемая галочка в меню) и клавиши для перемещения между окнами(мне удобней ctrl+стрелка) и вставку из клипборда на ctrl+v.
Ну и, правильно заметили выше — вместо screen — лучше tmux — ctrl+a я использую часто, а вот ctrl+b — не используем и хорошо подходит для контрольной последовательности.var_bin
14.12.2016 22:37Добрый вечер.
Спасибо за совет. Довольно интересная утилита. Наверное, в скором будущем буду ее пробовать. Серьезный претендент, чтобы заменить tmux.
maisvendoo
15.12.2016 07:07Для тех, кто работает под linux — есть terminator.
Который работает только в иксах. Как и упоминавшийся оратором выше способ создания вкладок в иксовом же эмуляторе.
Упоминая screen и tmux автору надо было акцентировать внимание на том, что означенные инструменты пригодны для использования и в «голой» консоли, без иксов.
MrSelfDestruct
15.12.2016 09:37А для Mac OS есть шикарный iTerm, который умеет такие же вкладки :)
DenimTornado
15.12.2016 11:01Ну для macOS много хороших вариантов есть. Мой фаворит TotalTermial, киллер фича ввиде выпадающей панельки в любой момент очень нравится!
ZyXI
15.12.2016 10:44+2Вместо
<C-a>
можно использовать что?то ещё в screen, как и вместо<C-b>
в tmux. Это настраивается. А вот тот же statusline в tmux менее ограничен, а настройки более понятны (кроме того, часто можно заменить малопонятное сокращение на что?то более читаемое: к примеру,#D
на более понятное#{pane_id}
). И проблема с сохранением layout: использую tmux, здесь такого нет. Даже не знал, что в screen есть.
am-amotion-city
15.12.2016 10:50+1terminator
не умеет"\u27a6"
нотацию, на которой построены все удобные темыzsh
, что делает его непригодным для людей с обостренной тягой к прекрасному.
Ну и не очень понятно, в чем его преимущество перед кондовой консолью.
user28
15.12.2016 11:01+1Даже если есть необходимость в putty, то под Windows есть ConEmu, в котором есть вкладки, сохранение сессий и многое другое.
Psychosynthesis
25.03.2017 16:02+17У меня боль в глазах, не могу камментить…
am-amotion-city
15.12.2016 11:29Офис, в котором разработчику отрезаны права на использование usb, установку софта и прочие ограничения, причем разработчик использует windows, но ему зачем-то при этом нужно логиниться на nix…
Теперь я знаю, как выглядит ад.
roversochi
26.03.2017 13:54Да уж, «бюджетненько» :)
Насколько я знаю, в них уже встроен энкодер.am-amotion-city
15.12.2016 12:45+1Если честно, и сам так работаю IDE на windows хосте, а код на удаленных VPS под linux.
Танцевать вприсядку с арбузом под мышкой каждый может, непонятно — зачем?
user28
15.12.2016 14:02Ну а какая мне разница под какой ОС работает у меня PhpStorm и браузер. Все равно ведь, весь код и среда исполнения у меня на удаленных серверах. Ну да немного напрягает в Windows отсутствие ssh из коробки, но плюсом для меня идет ms office и терабайт места в облаке.
Какие плюсы мне как веб разработчику дает linux или допустим macos на рабочей машине? Мне абсолютно все равно, что у меня установлено linux, либо же windows. Например на работе на десктопе и ноутбуке у меня ubuntu с xfce, дома на десктопе и ноутбуке windows10, и если честно, то для работы особой разницы не вижу. Все равно и там и там 90% времени открыт PhpStorm и браузер.am-amotion-city
15.12.2016 14:50весь код и среда исполнения у меня на удаленных серверах
Ясно. Я думал, XX век закончился и по живому уже аппендициты не вырезают.
user28
15.12.2016 15:28Вы правильно заметили, XX век закончился. Настало время облачных платформ и сервисов облачных вычислений, а также VPS по 3 евро штука и безлимитного высокоскоростного интернета. Если я вас правильно понимаю, то вы все еще тестируете свои проекты у себя на локалхосте, разворачивая там все рабочее окружение, а затем размещаете на shared хостинге? С моей точки зрения это как минимум странно, если это так. Я не пытаюсь вам навязывать свою точку зрения, но все таки попробуйте облака, это действительно удобно и возможно вам понравиться.
am-amotion-city
15.12.2016 15:41Если я вас правильно понимаю, то вы все еще тестируете свои проекты
у себя на локалхосте, разворачивая там все рабочее окружение,
а затем размещаете на shared хостинге?Я тестирую проекты в CI (Jenkins и SemaphoreCI). Деплой выполняется автоматически в облако. Но пишу код я по-прежнему локально, и буду делать так всегда, по очень многим причинам, одна из которых — 128G оперативки, в облаке такого отклика не достичь никак.
user28
15.12.2016 11:52Мне известно, что ConEmu не есть замена putty и про подсистему linux в windows 10, тоже знаю. Я просто ответил на комментарий о куче окон при использовании putty.
netch80
18.12.2016 18:10+1> вместо screen — лучше tmux — ctrl+a я использую часто, а вот ctrl+b — не используем и хорошо подходит для контрольной последовательности.
Всё почти наоборот. screen'у элементарно заменить переключающую последовательность — опции типа -e ^ba (для Ctrl+B) и так далее; есть и умолчание для screenrc. Я не пользуюсь Ctrl+A, у меня в зависимости от места Ctrl+F, B, N, местами ещё более редкие.
tmux'у с некоторых пор это тоже делается, но сильно более громоздко — например, для новой сессии надо сказать
tmux new-session \; set-option prefix ^n
так что сразу надо придумывать алиасы для этих длинных конструкций.
Ещё у tmux изначально нижняя статусная строка занимает ценное место (мне она обычно не нужна, хотя есть, наоборот, любители её постоянного наличия), тоже нужно допиливать, чтобы её не было.
Ещё из специфичного, что нужно мне — при общем utf-8, есть контексты, в которых надо запускать терминалы под koi8. Screen умеет перекодировки в обе стороны (и я ему ещё и koi8-u добавлял), tmux — нет.
am-amotion-city
15.12.2016 10:40+3Единственное ценное, что есть в статье — объяснение настройки
screen
. Oh, wait… Объяснения почему-то нет, а есть магия «скопируйте вот это вот туда».
Не, ну серьезно, можно же предложение «
screen
лучше, чемputty
— чем лучше? — чемputty
» как-то, ну не знаю, дополнить минимальными техническими подробностями перед созданием целой публикации.var_bin
15.12.2016 11:16Добрый день.
Не, ну серьезно, можно же предложение «screen лучше, чем putty — чем лучше?
Вот тут не понятно. screen не есть замена putty. Он не лучше и не хуже putty. Это немного два разных инструмента.
Единственное ценное, что есть в статье — объяснение настройки screen. Oh, wait… Объяснения почему-то нет, а есть магия «скопируйте вот это вот туда»..
Сначала хотел описать за что какой конфиг отвечает. Но потом понял, что я просто перепишу мануал на русский. Если что-то непонятно, то
man screen
поможет на счет раз.
Что означают непонятные символы в этой строкеhardstatus string "%-w%{= BW}%50>%n %t%{-}%+w%<"
можно почитать тут
mihmig
15.12.2016 10:57+1Автор забыл упомянуть шикарную фишку screen — возможность «расшарить» экран на двух и более пользователей (screen -x). Это полезно для обучения опытным пользователем новичка (а только именно так и возможно эффективно изучать Linux)
ZyXI
15.12.2016 11:03tmux тоже это умеет.
Кстати, некоторые сейчас рассматривают Neovim как замену screen и tmux: возможности
:terminal
буферов вместе с остальными возможностями *Vim, в принципе, это позволяют.
mihmig
15.12.2016 11:19Автор забыл упомянуть шикарную фишку screen — возможность «расшарить» экран на двух и более пользователей (screen -x). Это полезно для обучения опытным пользователем новичка (а только именно так и возможно эффективно изучать Linux)
var_bin
15.12.2016 11:34Добрый день.
Да, действительно, есть такая фича. Но до ее использования нужно дойти. Не хотелось грузить лишней информацией. Для новичка она лишняя. А вот опытный пользователь и сам про нее знает =). Только нужно использовать ее осторожно, на свой страх и риск.
alexyr
15.12.2016 12:44А насчет продолжения, первый же результат в гугле по запросу tmux:
Краткая шпаргалка по tmux (менеджеру терминалов)var_bin
15.12.2016 13:07-1Добрый день.
Спасибо за ссылку. Добавлю ее в полезные ссылки для следующей статьи.
gsaw
Только сейчас понял анекдот про чукчу объясняющему другому чукче, что такое трамвай. «Яблоко знашь? Совсем не похож!»
Сумбурно все написанно. Причем тут IE?
Shtucer
А мне не понятно зачем надо было писать ещё одну статью про screen, если в потом будет ещё одна статья про tmux.
var_bin
Добрый день.
Потому что информации много. Если писать все в одну статью, то для конечного читателя будет сложно читать.
Dreyk
зачем вообще начинать со скринов? Показывать, как их настраивать и сразу вызывать головокружения у новичка от не самых легких строк состояния.
Почему бы просто не рассказать только про тмукс, в котором гораздо более адекватные конфиги
var_bin
Добрый день. Спасибо за вопрос. IE здесь приводится в пример. Если бы у вас не было вкладок. Точно так же, без screen'а у вас недоступна возможность работы с вкладками в терминале.