Вступление


Всем привет! Данная серия статей — это текстовый вариант моего доклада на WSD в Киеве 26 ноября. Решил написать, чтобы дать более развернутое описание темам, которые были затронуты, а некоторые моменты уточнить. Кроме того, есть возможность рассмотреть больше примеров, услышать мнение от тебя, уважаемый читатель. И, конечно же, поделиться информацией с более широкой аудиторией.

План побега


  1. Менеджеры терминалов. Часть первая
  2. Менеджеры терминалов. Часть вторая
  3. Скрипты на bash
  4. Автоматизация рутинных задач

Важный момент. Предполагается, что читатель уже имеет опыт работы с терминалом на *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. Перед этим не забудьте поместить файл настроек в домашнюю директорию пользователя.



  1. Рабочая область. Layout.
  2. Строка состояния. На ней размещаются вкладки и другие элементы.
  3. Вкладка с именем по умолчанию.

Мы рассмотрели начальное состояние 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)


  1. gsaw
    14.12.2016 13:52
    +13

    Только сейчас понял анекдот про чукчу объясняющему другому чукче, что такое трамвай. «Яблоко знашь? Совсем не похож!»

    Сумбурно все написанно. Причем тут IE?


    1. Shtucer
      14.12.2016 14:19
      +4

      А мне не понятно зачем надо было писать ещё одну статью про screen, если в потом будет ещё одна статья про tmux.


      1. var_bin
        14.12.2016 14:39

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


        1. Dreyk
          15.12.2016 13:40
          +2

          зачем вообще начинать со скринов? Показывать, как их настраивать и сразу вызывать головокружения у новичка от не самых легких строк состояния.


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


    1. var_bin
      14.12.2016 14:37

      Добрый день. Спасибо за вопрос. IE здесь приводится в пример. Если бы у вас не было вкладок. Точно так же, без screen'а у вас недоступна возможность работы с вкладками в терминале.


  1. iroln
    14.12.2016 14:46
    +1

    без screen'а у вас недоступна возможность работы с вкладками в терминале

    Может глупость спрошу, но "открыть новую вкладку" в окне стандартного терминала, например, в Ubuntu — это не работа с вкладками? Или тут "вкладка" в терминале — это нечто большее чем просто вкладка в окне терминала? Ну, например, сохранение сессий, восстановление вкладок и т. д.?


    1. var_bin
      14.12.2016 14:51

      Добрый день.
      Ждал этого вопроса =). Да, согласен, что вкладками никого не удивишь. Тут именно вся соль в том, что screen умеет сохранять сессии, процессы, восстанавливать вкладки, разделять layout на несколько независимых регионов и много других полезных мелочей. В статье про tmux кроме всего прочего будет показано, как настроить сохранение сессий для ssh. Если оборвалась сессия, то он все сохраняет и не требует повторного ввода пароля. Как это может быть со стандартным терминалом.


      1. snp
        15.12.2016 08:37
        +2

        Какого ещё пароля? Вы ещё ssh ключами не пользуетесь что ли? 2017 год уже на носу.


        1. var_bin
          15.12.2016 11:28

          Добрый день.
          Да, нужно было уточнить. Опять же, при работе через putty. Если происходит обрыв связи, даже, при соединении по ssh. При следующем подключении к сессии, неважно, screen, tmux или еще что-то там, то без дополнительной магии терминал, вас вежливо попросит ввести пароль. И нужно будет перезапустить сессию заново.


          1. RubyFOX
            27.03.2017 10:39

            Ну я так вообще небольшой 3D-принтер собирал, а там питание через нормальные драйвера шли 4988, питание естественно должно быть с запасом.


          1. mariner
            15.12.2016 23:40

            Добрый день.


  1. alexkuzko
    14.12.2016 16:25

    Автору может быть интересен screenie. Визуализирует сессии.


    1. var_bin
      14.12.2016 17:50

      Добрый день.
      Спасибо за совет. Пробовал, довольно интересно. Интерактивная надстройка над screen'ом. Если и начинать им пользоваться, то уже после того, как достаточно долгое время используешь screen. А то будет слишком много магии =)


  1. Sirikid
    14.12.2016 19:34

    Почему скрипты именно на bash?


    1. var_bin
      14.12.2016 20:16

      Добрый вечер.
      Спасибо за вопрос. Все просто — в 99% когда вы садитесь за компьютер, который работает на *nix подобных OS, оболочка по умолчанию, которая обрабатывает команды пользователя будет bash. Конечно, есть еще такая оболочка как zsh, но это уже совсем другая история.


      1. Sirikid
        14.12.2016 21:31
        +1

        Ну да, 99%, но ведь есть ещё оставшийся 1%. И bash не стандартизирован, лично я считаю что стоит писать скрипты на POSIX sh, потому что он стандартизирован и есть миллион различных совместимых реализаций.


  1. gre
    14.12.2016 21:25
    +1

    Для тех, кто работает под linux — есть terminator.
    Совершенно внезапно он умеет обходится без кучи putty окон, а разбиение окон очень быстро делается в процессе работы.
    Из минусов — в моём случае потребовалось изменить прямо в исходнике применение клавиш мышки (говорят, что в свежей версии у автора есть требуемая галочка в меню) и клавиши для перемещения между окнами(мне удобней ctrl+стрелка) и вставку из клипборда на ctrl+v.

    Ну и, правильно заметили выше — вместо screen — лучше tmux — ctrl+a я использую часто, а вот ctrl+b — не используем и хорошо подходит для контрольной последовательности.


    1. var_bin
      14.12.2016 22:37

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


    1. maisvendoo
      15.12.2016 07:07

      Для тех, кто работает под linux — есть terminator.

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

      Упоминая screen и tmux автору надо было акцентировать внимание на том, что означенные инструменты пригодны для использования и в «голой» консоли, без иксов.


    1. MrSelfDestruct
      15.12.2016 09:37

      А для Mac OS есть шикарный iTerm, который умеет такие же вкладки :)


      1. DenimTornado
        15.12.2016 11:01

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


    1. ZyXI
      15.12.2016 10:44
      +2

      Вместо <C-a> можно использовать что?то ещё в screen, как и вместо <C-b> в tmux. Это настраивается. А вот тот же statusline в tmux менее ограничен, а настройки более понятны (кроме того, часто можно заменить малопонятное сокращение на что?то более читаемое: к примеру, #D на более понятное #{pane_id}). И проблема с сохранением layout: использую tmux, здесь такого нет. Даже не знал, что в screen есть.


    1. am-amotion-city
      15.12.2016 10:50
      +1

      terminator не умеет "\u27a6" нотацию, на которой построены все удобные темы zsh, что делает его непригодным для людей с обостренной тягой к прекрасному.


      Ну и не очень понятно, в чем его преимущество перед кондовой консолью.


    1. user28
      15.12.2016 11:01
      +1

      Даже если есть необходимость в putty, то под Windows есть ConEmu, в котором есть вкладки, сохранение сессий и многое другое.


      1. Psychosynthesis
        25.03.2017 16:02
        +17

        У меня боль в глазах, не могу камментить…


        1. am-amotion-city
          15.12.2016 11:29

          Офис, в котором разработчику отрезаны права на использование usb, установку софта и прочие ограничения, причем разработчик использует windows, но ему зачем-то при этом нужно логиниться на nix…


          Теперь я знаю, как выглядит ад.


          1. roversochi
            26.03.2017 13:54

            Да уж, «бюджетненько» :)
            Насколько я знаю, в них уже встроен энкодер.


            1. am-amotion-city
              15.12.2016 12:45
              +1

              Если честно, и сам так работаю IDE на windows хосте, а код на удаленных VPS под linux.

              Танцевать вприсядку с арбузом под мышкой каждый может, непонятно — зачем?


              1. user28
                15.12.2016 14:02

                Ну а какая мне разница под какой ОС работает у меня PhpStorm и браузер. Все равно ведь, весь код и среда исполнения у меня на удаленных серверах. Ну да немного напрягает в Windows отсутствие ssh из коробки, но плюсом для меня идет ms office и терабайт места в облаке.

                Какие плюсы мне как веб разработчику дает linux или допустим macos на рабочей машине? Мне абсолютно все равно, что у меня установлено linux, либо же windows. Например на работе на десктопе и ноутбуке у меня ubuntu с xfce, дома на десктопе и ноутбуке windows10, и если честно, то для работы особой разницы не вижу. Все равно и там и там 90% времени открыт PhpStorm и браузер.


                1. am-amotion-city
                  15.12.2016 14:50

                  весь код и среда исполнения у меня на удаленных серверах

                  Ясно. Я думал, XX век закончился и по живому уже аппендициты не вырезают.


                  1. user28
                    15.12.2016 15:28

                    Вы правильно заметили, XX век закончился. Настало время облачных платформ и сервисов облачных вычислений, а также VPS по 3 евро штука и безлимитного высокоскоростного интернета. Если я вас правильно понимаю, то вы все еще тестируете свои проекты у себя на локалхосте, разворачивая там все рабочее окружение, а затем размещаете на shared хостинге? С моей точки зрения это как минимум странно, если это так. Я не пытаюсь вам навязывать свою точку зрения, но все таки попробуйте облака, это действительно удобно и возможно вам понравиться.


                    1. am-amotion-city
                      15.12.2016 15:41

                      Если я вас правильно понимаю, то вы все еще тестируете свои проекты
                      у себя на локалхосте, разворачивая там все рабочее окружение,
                      а затем размещаете на shared хостинге?

                      Я тестирую проекты в CI (Jenkins и SemaphoreCI). Деплой выполняется автоматически в облако. Но пишу код я по-прежнему локально, и буду делать так всегда, по очень многим причинам, одна из которых — 128G оперативки, в облаке такого отклика не достичь никак.


        1. user28
          15.12.2016 11:52

          Мне известно, что ConEmu не есть замена putty и про подсистему linux в windows 10, тоже знаю. Я просто ответил на комментарий о куче окон при использовании putty.


    1. 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 — нет.


  1. am-amotion-city
    15.12.2016 10:40
    +3

    Единственное ценное, что есть в статье — объяснение настройки screen. Oh, wait… Объяснения почему-то нет, а есть магия «скопируйте вот это вот туда».


    Не, ну серьезно, можно же предложение «screen лучше, чем putty — чем лучше? — чем putty» как-то, ну не знаю, дополнить минимальными техническими подробностями перед созданием целой публикации.


    1. 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%<" можно почитать тут


  1. mihmig
    15.12.2016 10:57
    +1

    Автор забыл упомянуть шикарную фишку screen — возможность «расшарить» экран на двух и более пользователей (screen -x). Это полезно для обучения опытным пользователем новичка (а только именно так и возможно эффективно изучать Linux)


    1. ZyXI
      15.12.2016 11:03

      tmux тоже это умеет.


      Кстати, некоторые сейчас рассматривают Neovim как замену screen и tmux: возможности :terminal буферов вместе с остальными возможностями *Vim, в принципе, это позволяют.


  1. mihmig
    15.12.2016 11:19

    Автор забыл упомянуть шикарную фишку screen — возможность «расшарить» экран на двух и более пользователей (screen -x). Это полезно для обучения опытным пользователем новичка (а только именно так и возможно эффективно изучать Linux)


    1. var_bin
      15.12.2016 11:34

      Добрый день.
      Да, действительно, есть такая фича. Но до ее использования нужно дойти. Не хотелось грузить лишней информацией. Для новичка она лишняя. А вот опытный пользователь и сам про нее знает =). Только нужно использовать ее осторожно, на свой страх и риск.


  1. alexyr
    15.12.2016 12:44

    А насчет продолжения, первый же результат в гугле по запросу tmux:
    Краткая шпаргалка по tmux (менеджеру терминалов)


    1. var_bin
      15.12.2016 13:07
      -1

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