Что мне нужно знать, чтобы правильно использовать GNU Screen? [закрыто]

106

Я только что познакомил друга с GNU Screen, и ему трудно к нему привыкнуть. Это заставляет меня задуматься о важных вещах, которые ему нужно знать об отличной утилите Screen , о тех вещах, которым, по вашему мнению, стоит научить кого-то, новичка, с нуля. Какие есть аналогии и полезные советы по запоминанию биндов и т. Д.?

Это было бы замечательно.

Генри Б.
источник
1
Здесь также есть несколько хороших ответов на этот вопрос: stackoverflow.com/questions/70661/what-is-gnu-screen
Крис,
Кто-то разместил аналогичный вопрос в Server Fault .
Vagnerr
Если кто-то только начинает работать с Screen и испытывает трудности с ним, они могут захотеть проверить альтернативный tmux .
Кристофер Боттомс,

Ответы:

93

Я использую Screenболее 10 лет и, вероятно, использую менее половины функций. Так что изучать сразу все его возможности определенно не обязательно (и я бы не рекомендовал пробовать). Мои повседневные команды:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

Думаю, все. Иногда я использую функции разделения экрана, но, конечно, не ежедневно. Другой совет: если кажется, что экран заблокирован из-за того, что вы случайно нажали какую-то случайную комбинацию клавиш, выполните оба действия ^Qи^A ^Q попытайтесь разблокировать его.

Грег Хьюгилл
источник
1
^ Чтобы закрыть окно, нужно добавить k в список.
Лео Леопольд Герц 준영
7
Я не использую ^ A k из-за возможности случайно убить больше, чем собираюсь. Вместо этого я просто выхожу из оболочки в окне с помощью ^ D (или exit). Окно экрана автоматически закрывается после выхода из последней оболочки в окне.
Грег Хьюгилл,
9
"^ Режим esc - копирования, который я использую для прокрутки назад" Вы бог среди людей, сэр.
Роб Ховард
4
^ A [делает то же самое.
atx
Спасибо за трюк ^ A ^ D ... Я застрял и не мог вернуться к сеансу. На случай, если это поможет кому-то, я недавно написал статью, в которой объясняются основы работы с экранами, как здесь, но есть еще несколько трюков geekpad.ca/blog/post/…
Патрик Забыть
36

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

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$
Roel
источник
3
Также обратите внимание на byobu (профили экранов): launchpad.net/byobu
Дрю Стивенс
Это потрясающе, спасибо. Я изо всех сил пытался понять, что на самом деле происходит, когда я пытался разделить свой терминал. Я не понимал, что мне нужно сначала запустить screen, чтобы заставить любую из этих команд работать, я знаю, глупо.
Огадай
30

Ctrl+ A? - показать экран справки!

Джеймс Маскат
источник
Я полностью согласен с этим. Это гораздо более полезно, чем другие ответы, поскольку вы можете вычесть другие команды по нему, но вы не можете сделать это наоборот. Кроме того, это намного легче запомнить.
Лео Леопольд Герц 준영
26

Если ваш друг имеет обыкновение нажимать, ^Aчтобы перейти к началу строки в Bash, его / ее ждут некоторые сюрпризы, так ^Aкак это привязка клавиши экранной команды. Обычно я получаю зависший экран, возможно, из-за какой-то случайной клавиши, которую я нажал после^A :-)

В этих случаях я стараюсь

^A s и ^A q заблокировать / разблокировать прокрутку терминала

чтобы исправить это. Для перехода к началу строки внутри экрана, ключевая последовательность ^A a.

Агнул
источник
1
Заменить escape-символ с ^ A на что-то другое легко. Я изложил подробности в своем ответе.
Эндрю Джонсон,
3
+ 1 + 1 + 1 ^ A s ... спасибо ... заблокированный экран :)
Yuji 'Tomita' Tomita
1
@agnul +1 для вас за ^ A a Я использую ^ A в обычном сеансе bash и не могу использовать его внутри сеанса экрана. Спасибо за отличный отзыв! :)
icasimpan
100 раз спасибо за то, что рассказали мне, как заставить ctrl A работать внутри экрана. Искал это всю свою жизнь.
user674669
Учитываются ли здесь регистр букв "A" и "a"?
Aditya MP
12

Вы можете переназначить escape-клавишу с Ctrl+ Aна другую клавишу по вашему выбору, поэтому, если вы действительно используете ее для чего-то еще, например, чтобы перейти к началу строки в bash, вам просто нужно добавить строку в ваш ~ /. screenrc файл. Чтобы сделать это ^ b или ^ B, используйте:

escape ^bB

В командной строке используйте сеансы имен, чтобы контролировать несколько сеансов. Я использую один сеанс для каждой задачи, каждая с несколькими вкладками:

  screen -ls # Выводит список ваших текущих сеансов экрана
  screen -S <name> # Создает новый сеанс экрана с именем name
  screen -r <name> # Подключается к названным сеансам экрана

При использовании screen вам понадобится всего несколько команд:

  ^ A c Создать новую оболочку
  ^ A [0-9] Переключатель оболочки
  ^ A k Убить текущую оболочку
  ^ A d Отключиться от экрана
  ^ А? Показать помощь

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

Эндрю Джонсон
источник
Я использую вложенные сеансы экрана. Я начинаю с внешнего, screen -e^ooпоэтому могу использовать для этого Ctrl + O, а затем начинаю с внутреннего, screen -mчтобы они запускали новые сеансы.
staticsan
1
Вы можете изменить клавишу выхода на лету. Во время сеанса работы с экраном введите, ^A :а \Bbзатем нажмите Enter, чтобы установить для клавиши выхода значение ^ B. В общем, ^A :позволяет оценить команду, которую вы .screenrcпонимаете.
malana
8

Несколько советов для тех, кто знаком с screen, но не помнит то, что читал на странице руководства:

  • Изменить название экранного окна очень просто: ctrl+ A shift+ A.
  • Вы пропустили последнее сообщение с экрана? ctrl+ a ctrl+ mпокажет вам это снова.
  • Если вы хотите что-то запустить (например, следить за файлом), и экран сообщит вам об изменениях, используйте ctrl+ A shift+ mв целевом окне. Предупреждение: он сообщит вам, если что-то изменится.
  • Хотите выбрать окно 15 напрямую? Попробуйте это в своем .screenrcфайле:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

Это дает ctrl+ a shift+ 0 through 9для окон с 10 по 19.

статический
источник
7

Ctrl+ A- это базовая команда

Ctrl+ A N= перейти на экран *** N *** ext

Ctrl+ A P= перейти на предыдущий экран *** P ***

Ctrl+ A C= *** C *** создать новый экран

Ctrl+ A D= *** D *** etach your screen

Нико Гунади
источник
6

http://www.debian-administration.org/articles/34

Я написал это пару лет назад, но это все еще хорошее введение, которое получает много положительных отзывов.


источник
Ссылка (фактически) не работает:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Питер Мортенсен
6

Я "должен" добавить это: добавить

bind s

к вашему .screenrc, если вы - как и я - использовали разделенные окна, так как C-a Sфактическое окно разбивается, но C-a sзамораживается. Поэтому я просто отключил ярлык замораживания.

Жолт Ботыкай
источник
2
^-Qразмораживается при ударе^-S
Платон
Вы правы, @Plato. Тем не менее, я работаю в среде с пользователями, которые не запоминают почти ни один ярлык ... Мне нужно было отключить его.
Zsolt Botykai
Н.П., я просто сначала нашел эту тему, искал 'freeze' и не нашел того, что искал
Платон
6

Ctrl+ a- специальный ключ.

Ctrl+ a d- [d] etach, оставить программы (irssi?) в фоновом режиме, вернуться домой.

Ctrl+ a c[c] создать новое окно Ctrl+ a 0-9переключаться между окнами по номеру

screen -r - вернуться к отключенному сеансу

Это покрывает 90% случаев использования. Не пытайтесь показать весь функционал одновременно.

Тадеуш
источник
Хотя, когда я впервые узнал об этом, screenя был смущен тем, что на самом деле означает отсоединение и повторное прикрепление экрана. Цитата : «... у вас могут быть длительно выполняющиеся задачи на отдельных консолях (например, ssh на удаленном компьютере, сеансы IRC и т. Д.) На данном компьютере, отключаться от сеанса, перемещаться из одного физического места в другое, подключаться к машину через ssh и повторно подключитесь к сеансу экрана, чтобы продолжить работу ".
JW.
4

Не очень важно, не только связано с экраном, но включение 256 цветов в моем терминале, GNU Screen и Vim значительно улучшили мой опыт работы с экраном (тем более, что я кодирую в Vim около 8 часов в день - есть несколько отличных удобных для глаз цветовых схем).

Jkramer
источник
Спасибо! Это меня давно беспокоит.
Дэн Голдштейн
3

Первая модификация, которую я внес в .screenrc, - это изменить команду escape. Как и многие из вас, мне не нравится последовательность Ctrl-A по умолчанию из-за того, что она мешает этой фундаментальной функции почти в любом другом контексте. В моем файле .screenrc я добавляю:

побег `е

Это обратная кавычка.

Это позволяет мне использовать обратную кавычку в качестве клавиши перехода (например, для создания нового экрана я нажимаю обратную кавычку-c, отсоединение - обратная кавычка-d, обратная кавычка-? - помощь, обратная кавычка - предыдущий экран и т. Д.). Единственный способ, которым это мешает (и мне пришлось избавиться от этой привычки), - это использовать обратную кавычку в командной строке для захвата результатов выполнения или вставлять все, что содержит обратную кавычку. Что касается первого, я изменил свою привычку, используя соглашение BASH $ (команда). Для последнего я обычно просто открываю другой xterm или отключаюсь от экрана, а затем вставляю контент, содержащий обратную кавычку. Наконец, если я хочу вставить буквальную обратную кавычку, я просто нажимаю обратную кавычку-e.

Гэри Чемберс
источник
блестящий. Я все время использую обратные кавычки, хотя знаю, что мне следует использовать $ (...), так что теперь я думаю, что мне, возможно, придется изменить свой способ. Обратные кавычки немного в стороне, но хорошо иметь один ключ без необходимых модификаторов. Но почему именно «е» и как вы это запомнили?
iconoclast
Я только что протестировал `` побег '', он отлично работает и кажется, что его легче запомнить. Если вы нажмете обратную кавычку и не получите того, чего ожидаете, просто нажмите еще раз.
iconoclast
Я сделал это, но есть ли способ набрать обратную кавычку, находясь на экране? Иногда это необходимо, и я ненавижу отстраняться, чтобы сделать это ...
Гильошон
@Guillouchon: предыдущий комментарий объясняет именно это.
tripleee
3

Ведется некоторая интересная работа по получению хорошей настройки экрана GNU по умолчанию в следующей версии Ubuntu Server, которая включает использование нижней части экрана для отображения всех окон, а также других полезных сведений о машине (например, количество обновлений доступно и требуется ли перезагрузка машины). Вы, вероятно, можете взять их .screenrcи настроить под свои нужды.

Самые полезные команды, которые у меня .screenrcесть, следующие:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

Таким образом, я всегда знаю, какие окна открыты и что в них работает в данный момент.

Дэвид Дин
источник
3

Я использую для ssh:

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

Затем я установил следующие псевдонимы bash:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

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

Питер Мортенсен
источник
2

Мне нравится настраивать сеанс экрана с описательными именами для окон. ^ a A позволит вам дать имя текущему окну, а ^ a "предоставит вам список ваших окон. Когда закончите, отсоедините экран с помощью ^ ad и повторно прикрепите с помощью screen -R

ИННАМ
источник
1

Мне нравится использовать screen -d -RRдля автоматического создания / прикрепления к заданному экрану. Я создал функции bash, чтобы было проще ...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

Они создают псевдоним /usr/bin/screen -d -RR -S $name $command. Например, мне нравится использовать irssi в сеансе экрана, поэтому в моем .bashrc (под этими функциями) у меня есть:

mkscreen irc /usr/bin/irssi

Тогда я могу просто ввести irc терминал, чтобы войти в irssi. Если экран irc еще не существует, он создается и с него запускается / usr / bin / irssi (который, конечно, подключается автоматически). Если он уже запущен, я просто снова подключаюсь к нему, принудительно отсоединяя любой другой экземпляр, который уже подключен к нему. Это неплохо.

Другой пример - создание временных псевдонимов экрана для perldocs по мере их появления:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

Параметр -a (должен быть первым аргументом) добавляет псевдоним экрана к .bashrc (чтобы он был постоянным), а -d удаляет его (это потенциально может быть разрушительным, поэтому используйте его на свой страх и риск). xD

Добавить:

Еще один баш-изм, который мне удобен при длительной работе с экраном:

alias sls='/usr/bin/screen -ls'

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

бамбам
источник
0

^ AA вернется к экрану, с которого вы только что пришли.

манекен
источник
2
^ A ^ A переключает обратно, ^ AA позволяет переименовать заголовок окна.
Андрей Стародубцев
0

Ctrl+ A- отличный специальный персонаж для Unix-людей, но если вы используете экран для общения с OpenVMS , то неспособность ^ A сделает вас преждевременно лысым.

В VMS , если вы редактируете команду DCL перед выполнением из буфера истории, режим вставки отключен (это должно быть по нескольким причинам, я не буду здесь вдаваться) ... чтобы включить его, чтобы вы не Не набирайте команду слишком часто, а не разбрасывайтесь, вы должны нажать `^ A.

user2146463
источник
Пользуюсь screen -e ^Llпо тем же причинам; Я просто не могу отучиться набирать ctrl-A, чтобы перейти к началу строки в Emacs. К счастью, ctrl-L - это нажатие клавиши, которое мне редко нужно, и, кроме того, оно, IMHO, прекрасно сочетается со своим общим значением (перерисовка / очистка экрана).
Tripleee
@tripleee: My .screenrchas escape ^@^@, в котором используется нулевой символ, а не control-A. В большинстве систем вы можете ввести нулевой символ в качестве контрольного пробела, который очень легко набрать. (У меня есть вложенный сеанс экрана, работающий внутри окна в моем основном сеансе; для этого у меня есть escape ^]^].)
Кейт Томпсон