Що я повинен знати, щоб правильно використовувати екран GNU? [зачинено]


106

Я щойно представив друга на GNU Screen, і вони важко звикають до нього. Це змушує мене задуматися про найважливіші речі, які він повинен знати про відмінну корисність екрану , про ті самі речі, які, як вам здається, варто навчати когось із початківців. Які існують аналогії та зручні поради щодо запам'ятовування палітур тощо?

Це було б приголомшливо.


1
Є кілька хороших відповідей на це також і тут: stackoverflow.com/questions/70661/what-is-gnu-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
^ А [робить точно те саме.
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 ~]$

3
Ознайомтеся також з byobu (екрани-профілі): startpad.net/byobu
Дрю Стівенс

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

30

Ctrl+ A? - покажіть екран довідки!


Я з цим повністю згоден. Це набагато корисніше, ніж інші відповіді, оскільки ви можете вирахувати за ним інші команди, але навпаки не можете це зробити. Також набагато простіше запам'ятати річ.
Лео Леопольд Герц 준영

26

Якщо ваш друг звик натискати, ^Aщоб перейти до початку рядка в Bash, він / вона чекає деяких сюрпризів, оскільки ^Aприв'язка клавіш до екрана. Зазвичай я закінчую заморожений екран, можливо через якусь випадкову клавішу, яку я натиснув після ^A:-)

У тих випадках я намагаюся

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

щоб виправити це. Щоб перейти до початку рядка всередині екрану, це послідовність клавіш ^A a.


1
Легко змінити символ втечі з ^ A на щось інше. Я вклав деталі у свою відповідь.
Ендрю Джонсон

3
+ 1 + 1 + 1 ^ A s ... дякую ... заблокований екран :)
Yuji 'Tomita' Tomita

1
@agnul +1 для вас для ^ A a Я є користувачем ^ A у звичайному сеансі bash, і я не можу використовувати його всередині екранного сеансу. Дякую за чудову пораду! :)
icasimpan

Дякую 100 разів вам за те, що ви сказали мені, як отримати ctrl Робочий внутрішній екран. Шукав цього все своє життя.
користувач674669

Тут чутливі регістри "A" та "a"?
Депутат Адітія

12

Ви можете перевстановити ключ клавіші " Ctrl+", Aщоб бути ще одним ключем на ваш вибір, тому якщо ви використовуєте його для чогось іншого, наприклад, для переходу на початок рядка в bash, вам просто потрібно додати рядок до ~ /. файл screenrc. Щоб зробити це ^ b або ^ B, використовуйте:

escape ^bB

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

  screen -ls # Перераховує ваші поточні сеанси на екрані
  screen -S <ім'я> # Створює новий екранний сеанс під назвою ім'я
  screen -r <ім'я> # Підключається до названих сеансів екрана

При використанні екрана потрібно лише кілька команд:

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

Відмінна швидка довідка можна знайти тут . Варто робити закладки.


Я використовую вкладені сеанси екрану. Я запускаю зовнішній з того, screen -e^ooщоб я міг використовувати для цього Ctrl + O, а потім запустити внутрішні, screen -mщоб вони почали нові сеанси.
staticsan

1
Ви можете змінити ключ втечі на льоту. Під час сеансу запущеного екрана введіть, ^A :а \Bbпотім натисніть клавішу Enter, щоб встановити клавішу виходу на ^ B. Взагалі, ^A :дозволяє оцінити команду, яку .screenrcрозуміють ваші .
малана

8

Деякі поради для тих сортів, які знайомі з екраном, але, як правило, не запам'ятовують речі, які вони читають на сторінці чоловіка:

  • Змінити ім'я екранного вікна дуже просто: 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для Windows 10-19.


7

Ctrl+ Aє базовою командою

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

Ctrl+ A P= перейдіть до екрану *** P *** revable

Ctrl+ A C= *** C *** реагувати на новий екран

Ctrl+ A D= *** D *** встановіть ваш екран


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

NP я щойно знайшов цю тему і шукав "заморозити", і не знайшов того, що шукав
Платон

6

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

Ctrl+ a d- [d] етах, залиште програми (irssi?) у фоновому режимі, йдіть додому.

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

screen -r - поверніться до окремого сеансу

Це охоплює 90% випадків використання. Не намагайтеся показувати всю функціональність одночасно.


Хоча, коли я вперше дізнався про screenмене, я був розгублений у тому, що це насправді означає зняття та повторне прикріплення екрана. Цитата : "... у вас можуть бути тривалі виконання завдань на окремих консолях (наприклад, ssh на машині ремонта, сеанси IRC, ...) на даній машині, відірватися від сеансу, перейти з одного фізичного місця в інше, підключитися до машина через ssh і повторно приєднається до екранного сеансу, щоб продовжувати працювати. "
JW.

4

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


Дякую! Це мене хвилювало деякий час.
Ден Гольдштейн

3

Перша модифікація, яку я вношу в .screenrc, - це змінити команду escape. На відміну від багатьох з вас, мені не подобається послідовність Ctrl-A за замовчуванням через її втручання в цю основоположну функціональність майже в кожному іншому контексті. У свій .screenrc файл я додаю:

втеча `е

Це бетік-е.

Це дозволяє мені використовувати backtick як клавішу втечі (наприклад, для створення нового екрана, я натискаю backtick-c, від'єднання - backtick-d, backtick-? - допомога, backtick-backtick - попередній екран тощо). Єдиний спосіб, коли це заважає (і мені довелося зламати звичку), - використовувати backtick в командному рядку для зйомки результатів виконання або вставки всього, що містить backtick. Для першого я змінив свою звичку, використовуючи конвенцію BASH $ (command). Для останнього я зазвичай просто відкриваю інший xterm або відриваюся від екрана, а потім вставляю вміст, що містить backtick. Нарешті, якщо я хочу вставити буквальний backtick, я просто натискаю backtick-e.


блискучий. Я використовую бекстіки весь час, хоча я знаю, що мені слід використовувати $ (...), тож тепер я думаю, що, можливо, доведеться змінити свої способи. Назад трохи не вдається, але приємно мати одну клавішу без модифікаторів. Але чому "е", і як ви це пам’ятаєте?
іконоборство

Я щойно випробував 'escape' ', і це добре працює і запам'ятовується легше. Якщо ви потрапили в backtick і не отримаєте те, що очікуєте, просто натисніть його ще раз.
іконоборство

Я зробив це, але чи є спосіб насправді набрати backtick, перебуваючи на екрані? Іноді для цього доводиться це робити, і я ненавиджу, щоб це зробити, щоб зробити це ...
Guillochon

@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 $*
}

Він відкриває новий екран для вищезазначених псевдонімів і iff за допомогою ssh, він перейменовує назву екрана з ім'ям хосту ssh.


2

Мені подобається налаштувати сеанс на екрані з описовими іменами для Windows. ^ a A дозволить вам дати ім'я поточному вікні, а ^ a "дасть вам список ваших вікон. Закінчивши, від'єднайте екран із ^ оголошення та повторно додайте екран -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

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

У VMS , якщо ви редагуєте команду DCL перед виконанням з буфера історії, режим Insert вимкнено (це повинно бути з кількох причин, я сюди не потрапляю) ... увімкніть його, щоб ви не 't перезаписуйте команду, а не пробіл, ви повинні натиснути `^ A.


Я використовую screen -e ^Llз аналогічних причин; Я просто не можу навчитися вводити ctrl-A для переходу до початку рядка в Emacs. На щастя, ctrl-L - це натискання клавіш, яке мені рідко потрібне, а також IMHO добре поєднується зі своїм загальним значенням (перемальовування / очищення екрана).
tripleee

@tripleee: Мій .screenrc has escape ^@^@, який використовує нульовий символ, а не control-A. У більшості систем ви можете ввести нульовий символ як контрольний простір, який дуже легко набрати. (У мене в основному сеансі працює вкладений екранний сеанс, який працює всередині вікна; для цього я маю escape ^]^].)
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.