- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF136:Screen
Материал из Linuxformat.
- Screen Словосочетание «терминал “все в одном”» приобретает новый смысл.
Содержание |
Screen: Консоль по-новому
- Чем терминал не рабочий стол? Размеры те же, фон можно настроить, и даже оконный менеджер есть, сообщает Тихон Тарнавский.
Программа, о которой пойдет речь, описана на ее домашней странице как «оконный менеджер для терминала» – видимо, из скромности: функционал Screen куда шире. На деле за этим бесхитростным названием (англ. screen – экран) кроются такие возможности, что пока не опробуешь, их трудно даже вообразить. Конечно, все их охватить одной статьей невозможно: полная официальная документация программы по объему превосходит весь этот номер журнала. Поэтому после описания некоторых базовых вещей остановимся лишь на самых полезных и даже в каких-то случаях спасительных способностях Screen – а их тоже немало.
Начали! Э… мы уже начали?
Одна из основных особенностей Screen в том, что он «не путается у вас под ногами». С непривычки это может даже немного обескуражить: если в настройках Screen не задано отображать информацию о программе при запуске (рис. 1), вы можете этого запуска и вовсе не заметить. Скомандовав screen, вы увидите… приглашение командной строки – точно такое же, как до ввода этой команды.
Но на самом деле мы уже внутри: по умолчанию Screen запускает в своем первом окне вашу стандартную командную оболочку. Мы можем проверить это, дав ему какую-нибудь команду; но прежде, чем переходить к конкретике, стоит познакомиться с концепцией, на которой строятся команды Screen. Она довольно своеобразна и продиктована в первую очередь уже озвученным принципом «не путайся под ногами». Грубо говоря, управляющая клавиша у Screen всего одна. Нажатие на нее как бы переключает Screen в командный режим (привет любителям Vi!): собственно командой будет уже следующая клавиша.
На практике такой подход оказывается очень удобным. Действительно, с одной стороны Screen минимально вмешивается в управление любой работающей внутри него программы, а с другой – пульт управления самим Screen доступен буквально в одно касание.
Теперь давайте продолжим, а по ходу действия будем с этим пультом знакомиться.
И правда начали
Screen разрабатывается в рамках проекта GNU. Поэтому часто его для однозначности называют GNU Screen (особенно в англоязычной литературе). Страница программы, как нетрудно догадаться, расположена на сайте GNU: http://www.gnu.org/software/screen/.
Мы остановились на желании убедиться, что Screen уже работает. Описанная клавиша-префикс по умолчанию – это Ctrl+a, а на включаемом ею «пульте управления Screen» той же клавише соответствует одна из самых популярных команд – переключение на предыдущее активное окно. Сразу сделаем небольшое отступление насчет записи сочетаний клавиш: в документации к Screen сочетания вида Ctrl+a обозначены как ^A либо C-a. Мы будем придерживаться второго варианта.
Тут стоит упомянуть еще одну особенность: большинство клавиш означают одно и то же как с Ctrl, так и сами по себе. Это сделано для того, чтобы поведение программы не менялось от того, отпустили ли вы Ctrl после нажатия C-a.
Итак, дважды нажмите C-a. В нижней строке терминала появится сообщение «No other window» [Нет другого окна], выделенное инверсным цветом и фоном. Эта возникающая внизу инверсная область – статусная строка Screen; мы еще не раз коснемся ее в дальнейшем описании программы.
Для создания нового окна есть два способа. Первый – клавиша на «пульте», а именно C-a c (или C-a C-c). Но в таком окне запустится командная оболочка; а такое у нас уже есть. Потому перейдем сразу ко второму способу.
Вызов screen в командной строке внутри сессии создаст в ней новое окно. По умолчанию оно также будет содержать командную оболочку; но команде, в отличие от сочетания клавиш, можно передать параметры. В простейшем случае – при вызове с одним параметром – он воспринимается как имя команды, которую требуется запустить в новом окне вместо оболочки. Давайте для пробы запустим там top:
$ screen top
Ну как? Всё снова выглядит так, будто нет у нас никакого «оконного менеджера», и это правильно: Screen сам не делит терминал на области, а открывает любое свое окно в «полноэкранном» режиме. Чтобы убедиться в этом, снова нажмите C-a C-a: вы окажетесь в первоначальном окне с оболочкой. И команда screen top там присутствует, напоминая нам о последнем действии в этом окне. Можете вводить другие команды или создавать новые окна – top при этом будет продолжать работать, и вы сможете переключиться на него в любой момент. Когда вы выйдете из top, содержащее его окно автоматически закроется.
У этого второго способа запуска есть еще один вариант: с помощью внутренней команды Screen. Нажмите C-a: – в статусной строке появится приглашение в виде двоеточия. Это командная строка Screen, здесь можно вводить его внутренние команды.
Команда создания нового окна называется screen и принимает такие же параметры. Другими словами, здесь можно было ввести «screen top» и получить идентичный результат. Попробуйте запустить таким образом что-нибудь еще – например, текстовый редактор:
: screen emacs
(если вы предпочитаете не Emacs, замените по своему вкусу: vim, nano, mcedit…)
Получилось? Отлично. Но как теперь попасть в первоначальное окно с командной оболочкой? Нажатие C-a C-a переключает нас между top и редактором. Пора изучить другие способы переключения окон.
Ещё больше окон
Для переключения между более чем двумя окнами в Screen тоже есть несколько различных способов. Самый лаконичный из них – по номеру окна. Строго говоря, это десять отдельных команд, которым по умолчанию соответствуют клавиши от нуля до девяти. Ноль – это то окно, которое возникло при первоначальном запуске Screen; дальше – начиная с единицы, в порядке создания. Конечно, эту умолчательную нумерацию при желании можно легко изменить, но об этом чуть позже. Пока нам важно, что мы можем переключаться между тремя уже существующими окнами: C-a 0 – командная оболочка; C-a 1 – top; C-a 2 – текстовый редактор.
Но что делать, если вы забыли номера окон или вообще не хотите держать их в голове? Опять-таки выбор есть. Можно перед переключением по номеру вывести в статусную строку разовую подсказку с номерами окон и их заголовками (рис. 2) нажатием C-a w (от слова window – окно); звездочкой в этом списке обозначено активное окно. А можно перейти к другим способам выбора окна. Сделаем только небольшое отступление о заголовках окон, тем более, что и при рассмотрении остальных способов переключения они нам понадобятся.
Каждое окно в Screen имеет заголовок. По умолчанию, как мы уже видели в примере выше, таким заголовком становится имя команды, работающей в этом окне. Но его легко можно заменить своим, как, впрочем, и любое другое умолчание в Screen; причем тоже не одним способом. Первый способ позволяет задать другой заголовок прямо при запуске – с помощью ключа -t к команде screen (он доступен как из оболочки, так и из внутренней командной строки Screen):
screen -t заголовок_окна команда
А второй предназначен для изменения заголовков уже существующих окон и потому «привязан» к функциональной клавише. Переключитесь на нужное окно и нажмите C-a A (Ctrl-a Shift-a); в статусной строке появится пояснение «Set window's title to:» («установить заголовок окна в:») и затем текущий заголовок, который можно отредактировать или заменить новым.
Вернемся к переключению окон. Второй способ – выбор из списка. По нажатию C-a “ появится табличка из трех колонок (рис. 3): номер окна (Num), его заголовок (Name) и некие «флаги» (Flags; сейчас они для нас интереса не представляют). Теперь можно переместить курсор либо стрелками вверх/вниз, либо введя номер нужного окна; а затем перейти к выбранному окну нажатием Enter.
И, наконец, можно нажать C-a ' и после появившегося приглашения ввести номер или заголовок нужного окна – причем заголовок не обязательно вводить полностью: достаточно одной или нескольких первых букв, которые позволят однозначно отличить его от имен других открытых окон. Например, для переключения между упомянутыми выше тремя окнами с bash, top и emacs можно после C-a ' ввести b, t или e.
Кроме рассмотренных трёх вариантов переключения к любому окну, можно также перейти к следующему или предыдущему (в порядке номеров) клавишами C-a пробел (или C-a n) и C-a BackSpace (или C-a p).
Если наиболее удобным для себя вы найдёте переключение по номерам окон, остальные способы тоже могут пригодиться; например, если вы создадите больше десяти окон.
А теперь давайте хором
Зная, как создавать окна и переключаться между ними, вы можете захотеть отобразить на экране одновременно больше одного окна.
В Screen используется концепция неперекрывающихся окон: экран разбивается на прямоугольные области [англ. regions], в каждой из которых отображается ровно одно окно. Этот принцип может быть вам уже знаком, если вы использовали один из так называемых «тайловых» или «фреймовых» оконных менеджеров.
После запуска Screen есть одна такая область размером во весь экран (или окно терминала). Чтобы разделить экран на две горизонтальные области, нажмите C-a S. Активная область уменьшится по высоте вдвое, а на освободившемся месте возникнет новая, содержащая пустое окно. Теперь вы можете переключиться на неё нажатием C-a Tab, а затем выбрать одно из существующих окон любым рассмотренным выше способом. Повторные нажатия C-a S будут создавать новые горизонтальные области, уменьшая высоту уже существующих.
Вертикальное разделение на данный момент доступно в версии из Git, а готовые пакеты добавлены, насколько мне известно, только в Debian, и оттуда попали в Ubuntu, а возможно, и другие производные дистрибутивы. По крайней мере, в Mandriva, SUSE, Fedora, Arch, Slackware и Gentoo этот функционал отсутствует (благодарю участников форума unixforum.org за проверку этой информации). Если у вас Debian или Ubuntu с версией Screen не меньше 4.0.3‑10 или вы соберёте Screen самостоятельно, взяв исходный код из Git или из Debian, то вы сможете разделять области и по вертикали с помощью C-a |. Комбинируя вертикальное и горизонтальное разделение, можно добиться любого расположения окон, какое вам будет удобно.
Чтобы убрать какую-то из существующих областей, переключитесь на неё и нажмите C-a X. Кроме того, можно, наоборот, оставить только активную область, распахнув её на весь экран, с помощью C-a Q. Замечу здесь ещё раз, что области экрана и окна с программами – это две отдельные сущности: при удалении области содержащееся в ней окно не закроется, а будет по-прежнему доступно для выбора в любой из оставшихся или новых областей.
Осталось только научиться изменять размер созданных областей. Для этого предназначена команда resize [англ. «изменить размер»]. По умолчанию никакая клавиша на «пульте» для неё не назначена, но это можно легко сделать самостоятельно – ниже будет описано, как. Команда изменяет размер текущего окна (растягивая соседние при его уменьшении и сжимая при увеличении) и принимает один из шести видов аргументов, смысл которых таков (буквой N обозначено произвольное натуральное число):
- resize +N – Увеличить на N позиций.
- resize -N – Уменьшить на N позиций.
- resize N – Задать размер равным N.
- resize min – Уменьшить размер до минимально возможного.
- resize max – Увеличить размер до максимально возможного.
- resize = – Сделать все окна в ряду одинаковыми по размеру.
Если задать команду без аргумента, то одно из этих значений будет предложено ввести с клавиатуры. Как мы увидим позже, на клавишу можно назначить команду в том числе и с аргументом.
Как за каменной стеной
С многооконной работой мы уже достаточно познакомились; давайте теперь перейдём к тому, что я назвал спасительными возможностями Screen и что делает его чем-то большим, чем оконный менеджер.
Как неприятно бывает, когда работа прерывается в самый неподходящий момент! Случайно закрытое окно терминала, сбой X или обрыв SSH-соединения могут стоить вам нескольких часов работы – но только не в том случае, если вы используете Screen. Ему не страшна потеря той оболочки, из которой его запустили: Screen продолжает работать, а вместе с ним и все открытые внутри него программы. Достаточно лишь подключиться к начатой сессии с другого терминала.
Можете сразу проверить это. Закройте окно терминала с тремя окнами Screen, описанными в начале статьи (или отсоедините сам Screen от терминала, нажав C-a C-d). А затем откройте новое окно (или переключитесь на одну из виртуальных консолей; или зайдите на эту машину по SSH) и введите
screen -r
Буква r здесь от слова reattach – подключиться заново. Если у вас на этой машине открыта только одна сессия Screen, тут же произойдёт подключение к ней, и вы увидите всё точно в том же виде, как и до закрытия окна. Если сессий несколько, укажите после -r идентификатор нужной вам. При использовании Bash и установленном пакете bash-completion будет работать автодополнение. Идентификатор сессии состоит из номера процесса, имени сессии (по умолчанию туда подставляется имя устройства терминала, с которого вы запустили Screen) и имени хоста. Если имя сессии уникально, можно указать только его, вместо полного идентификатора.
Теперь представим другую ситуацию: вы ушли, не закончив работу, а потом решили продолжить, находясь в другом месте. У вас есть доступ по SSH к машине, на которой открыты все ваши программы, но сессия Screen осталась подключенной к терминалу. Просто добавьте ещё одну опцию (предварительно не забыв зайти на нужную машину по SSH):
screen -d -r
Сессия автоматически отключится [англ. detach] от удалённого терминала и подключится к тому, с которого введена команда.
У ключей -d и -r есть «усиленные» варианты, обозначенные заглавными буквами. Опция -R подключит Screen к первой доступной сессии, даже если их несколько, а при отсутствии доступных сессий создаст новую, выведя об этом сообщение в статусную строку. Опция -D не только отключит указанную (или первую доступную для -R) сессию, но и пошлёт сигнал «отбоя» (SIGHUP) родительскому терминалу. Это может быть полезно как раз при отключении сессии от удалённой машины, чтобы не оставлять там доступную под вашей учётной записью консоль (сама сессия Screen может быть защищена паролем).
А eсли вы вдруг решите завершить сеанс Screen вместе со всеми работающими внутри него программами, нажмите C-a C-\.
Один в поле не воин
Помимо собственных довольно богатых возможностей, Screen также умеет весьма успешно взаимодействовать с другими программами, работающими внутри него.
Например, можно копировать текст из одного окна в другое. Нажмите C-a [ или C-a Esc, чтобы начать выделять текст для копирования. Такое, казалось бы, неочевидное совмещение клавиш для этой команды объясняется весьма просто: клавиша Esc генерирует тот же код, что и C-[.
Затем переместите курсор к одной из границ нужного участка, нажмите пробел, перейдите к другой границе и повторите нажатие пробела. Текст скопирован. Возможно, вы заметили, что в процессе выделения курсор можно передвинуть за верхнюю границу экрана. Текст при этом будет прокручиваться: у Screen есть собственный буфер, независимый от используемого терминала. Поэтому команду копирования можно использовать не только собственно для копирования, но и для просмотра. Увидев нужное, можно отменить процесс выделения нажатием Esc или q.
Для вставки скопированного текста выберите нужное окно и нажмите C-a ]. Эту пару клавиш весьма просто запомнить: мы как бы берём текст в квадратные скобки (открывающая скобка – начало действия, закрывающая – окончание). Вставляемый текст будет напрямую передан внутренней программе – точно так же, как если бы вы его вводили с клавиатуры.
Кроме копирования текста из окна и вставки в окно, можно обмениваться содержимым между буфером обмена (не путать с буфером прокрутки каждого окна, упомянутым выше) и файлом. Клавиша C-a > сохранит буфер в файл (по умолчанию это /tmp/screen-exchange; как имя, так и расположение можно изменить); C-a < считает из того же файла; а C-a = удалит файл обмена. Запомнить также нетрудно – по аналогии с перенаправлением вывода и ввода в Bash.
Если вам нужно следить за какой-то программой, не обязательно создавать под её окно отдельную область и всё время туда поглядывать: Screen и это может сделать за вас. Если программа выдаёт звуковой сигнал (или же равнозначное ему «мерцание экраном» при отключенных сигналах динамика) при ожидаемом событии, ничего дополнительно не нужно делать: Screen сам сообщит об этом сигнале надписью вида «Bell in window 2» («звонок в окне 2»). Если вы не успели прочесть это (да и любое другое) сообщение, достаточно нажать 'C-a m (от «message» – сообщение) для его повтора.
Кроме того, можно включить слежение за конкретным окном [monitoring] нажатием C-a m. Тогда, как только команда в этом окне что-то выведет, появится сообщение «Activity in window 1». И, наконец, если команда, наоборот, постоянно что-то выводит в процессе работы (например, происходит компиляция), можно точно так же отслеживать окно на прекращение активности, нажав C-a _. По умолчанию сообщение будет выдано после тридцати секунд непрерывного молчания.
Так и запишем
Другая программа с аналогичным функционалом называется tmux и разрабатывается в рамках проекта OpenBSD. Вопреки доступным в сети описаниям, различия между ними не так велики. Сайт проекта: http://tmux.sourceforge.net.
Если в процессе работы со Screen вы заметите, что какие-то конкретные команды приходится вводить в его командной строке слишком часто, самое время заняться настройками.
Пользовательские настройки Screen задаются в файле .screenrc в домашнем каталоге. Используется он точно так же, как, скажем, .bashrc для командной оболочки Bash: в него можно записывать команды, которые по умолчанию (то есть если вы не откажетесь от этого с помощью специальных опций) выполняются при каждом старте новой сессии Screen. Здесь применимы любые внутренние команды, включая уже рассмотренную screen, создающую новые окна: с её помощью вы можете задать автоматический запуск в отдельных окнах программ, используемых постоянно.
Для начала можете скопировать пример файла настроек, идущий в комплекте с программой, и отредактировать его на свой вкус. Обычно он называется screenrc и лежит в каталоге /usr/share/doc/screen/examples. Также можете просмотреть вариант общесистемного файла etcscreenrc из того же каталога.
Рассмотрим пару полезных примеров. Во-первых, это уже упомянутая команда screen. Для создания при старте тех же окон, что мы создали вручную в самом начале, добавьте в файл команды
screen screen top screen emacs
Впрочем, top в окне под цифрой 1 может немного мешать: удобнее иметь в первых окнах программы, с которыми вы действительно работаете, а не поглядываете на них время от времени. Потому отодвинем его подальше, задав номер окна при старте:
screen 9 top
И в завершение назначим клавиши для команды resize:
bind ( resize -1 bind ) resize +1
Теперь по нажатию C-a ( активная область будет уменьшаться на одну позицию, а по C-a ) – увеличиваться.
На этом наш краткий экскурс завершен. Надеюсь, вам будет его достаточно, чтобы начать работать с этим замечательным инструментом и изучать его более детально уже в процессе, на практике.