Быстрое переключение между виртуальными сессиями (экран?)

19

Я хотел бы иметь несколько виртуальных сессий в одном окне замазки и быстро переключаться между ними. Какой лучший способ сделать это? screen? Я знаю, что могу отсоединиться, ctrl+adа затем снова присоединиться к другому сеансу, но это похоже на много печатания.

ZZZ
источник

Ответы:

22

Просто для того, чтобы расширить сказанное Ансгаром в случае, если вы не очень хорошо знакомы с экраном gnu, наличие нескольких «окон» в одном сеансе экрана, вероятно, достигнет того, что вам нужно.

ctrl+ a, cсоздаст новое «окно» в вашем активном сеансе экрана. Вы можете переключаться между несколькими окнами (как указано Ansgar) с ctrl+ a, nв следующем окне, и ctrl+ a, pв предыдущем окне.

ctrl+ a, "даст вам список всех ваших открытых окон.

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

Если добавить следующую строку в ~ / .screenrc он всегда будет отображать открытые окна и который один выбран, так что вам не нужно отслеживать, какие окна вы на помня.

hardstatus alwayslastline '%{= kg}[ %{G}%H %{g}][%= %{= kB}%?%-Lw%?%{+b r}(%{G}%n*%f %t%?(%u)%?%{r})%{-b B}%?%+Lw%?%?%= %{g}%]'

Это строка hardstatus, которую я люблю использовать, но она полностью настраиваема (см. Справочную страницу или поиск в Google для "gnu screen hardstatus").

Есть множество других вещей, которые вы можете сделать с ним (например, назвать разные открытые окна), поэтому стоит прочитать некоторые учебники.

Вот пара, которую я нашел с помощью быстрого поиска:

http://news.softpedia.com/news/GNU-Screen-Tutorial-44274.shtml

http://www.ibm.com/developerworks/aix/library/au-gnu_screen/

И конечно самое полезное из всех:

# From your terminal:
$ man screen

Надеюсь, это поможет.

Мэтью

Мэтью
источник
2

Да, screenэто наиболее вероятный путь. Ctrl+ a, nПриведет вас к следующему окну, Ctrl+ a, pк предыдущему. Ctrl+ a, 0.. 9позволит вам переключиться на определенный экран.

Ансгар Вичерс
источник
Вы можете установить более быстрые сочетания клавиш, например, F11 для предыстории, F12 для следующего окна. И измените экранирующий символ экрана ^aна что-то другое, чтобы не было смешно раздражать использование строкового редактирования в стиле emacs в bash, что угодно еще. Я использую ^t.
Питер Кордес
1

То, что говорят другие, правильно. Я просто хочу упомянуть tmuxявляется альтернативой screen. У них очень похожие команды.

Оба screenи tmuxпредлагают несколько окон для сеанса работы, и это, вероятно, то, что вы хотите. tmuxдополнительно предлагает прыжки между несколькими сессиями (каждая из которых имеет свои собственные окна). Тебе это понадобится очень редко.

Вот несколько ссылок на документацию по screen и краткий курс о tmux .

tkruse
источник
1

Через столько времени я создал скрипт, чтобы обойти эту совершенно отсутствующую функцию. Прежде всего, это нужно FIFO:

mkdir ~/.screen
mkfifo ~/.screen/pipe

Этот именованный канал полезен для связи между отключенным сеансом и сеансом «Главный экран без экрана».

Файл sc (в $ PATH):

#!/bin/bash
CONFIGFILE=~/.screen/"$1""rc"

if [ ! -r $CONFIGFILE ] ; then
   echo "Configurazione per $1 Assente" >&2
   exit 1
fi

exec 3<> ~/.screen/pipe

if [ "$STY" != "" ] ; then
   screen -d "$STY"
   echo "$1" >&3
else
   screen -r "$1" 2>/dev/null || screen -S "$1" -c $CONFIGFILE
   while true ; do
      read line <&3
      screen -r "$line" 2>/dev/null || screen -S "$line" -c ~/.screen/"$line""rc"
   done
fi

Пример «CONFIGFILE»: ~ / .screen / Monitorrc

layout new Monitor

screen -t "bash" bash --login
split -v
focus next
split 
focus bottom
screen -t "cv" sh -c "watch /usr/bin/cv -w"
split
focus bottom
screen -t "sys.log" sh -c "tail -F /var/log/sys.log"
focus up
focus up
resize 25
screen -t "top" sh -c "top"
focus left

Результат: когда вы хотите запустить тип экрана:

sc Monitor

или другой сеанс, который вы хотели бы изобрести, я использую Session Work для разных вещей

Пример: ~ / .screen / Workrc

layout new Work  
screen -t "bash" bash --login  

Теперь мы находимся в Session Monitor, когда набираем:

sc Work

Монитор сеанса отсоединяется и пишет «Работа» в именованную трубу. Следовательно, первый скрипт sc идет вперед и присоединяет сессию «Работа».
Sc вызывается из сеанса Monitor close.

Когда мы отсоединяем все сеансы, мы находимся в бесконечном цикле, поэтому мы должны выполнить Ctrl-c, чтобы выйти.

Thomas8
источник
1

Вы можете сделать это с помощью простого сценария оболочки, как

    for s in `screen -ls | grep Detached | grep <regex to your screen names>`; do screen -r $s; done 
  1. Предположим, у вас есть несколько открытых экранов. Предположим также, что вы относите их к категории работы и данных.

    for i in {10..13}; do screen -S `printf data%02d $i`; done;
    for i in {0..5}; do screen -S `printf work%02d $i`; done;
    ...
    
  2. Применяя screen -ls, вы должны иметь свои экраны, как это

    There are screens on:
        81592.data13    (Detached)
        81539.work04    (Detached)
        81527.work02    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81533.work03    (Detached)
        81488.work00    (Detached)
        81607.ttys014.Mo    (Attached)
        81545.work05    (Detached)
        81580.data11    (Detached)
        81521.work01    (Detached)
        81515.work00    (Detached)
    12 Sockets in /var/folders/qs/cvlbhpr54fnb96vtx01bs9k00000gn/T/.screen.
    
  3. Теперь давайте выделим отдельные экраны с помощью grep.

    screen -ls | grep Detached
    

Вы должны получить что-то вроде этого

        81592.data13    (Detached)
        81539.work04    (Detached)
        81527.work02    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81533.work03    (Detached)
        81488.work00    (Detached)
        81545.work05    (Detached)
        81580.data11    (Detached)
        81521.work01    (Detached)
        81515.work00    (Detached)
  1. Теперь давайте выберем те, которые вы хотите (например, данные), снова используя grep.

    screen -ls | grep Detached | grep data
    

Это изолирует только экраны данных. Вы можете изменить ключевое слово grep с помощью регулярных выражений для поиска, чтобы настроить поиск.

        81592.data13    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81580.data11    (Detached)
  1. К счастью, результат хорошо структурирован и разделен табуляцией. Теперь давайте разделим столбцы на поля и выберите 2-е поле, используя cut.

    screen -ls | grep Detached | grep data | cut -d'       ' -f2
    

Вам нужно будет нажать ctrl+vзатем вкладку, чтобы вставить tabпараметр после разделителя -d. Результаты должны быть такими.

81592.data13
81586.data12
81574.data10
81580.data11
  1. Теперь пакет это в команду , используя ...кавычки и петлю над результатами , как это. Всегда проверяйте сформулированные команды 1-й перед тем, как запускать их. я использовалecho screen -r

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        echo screen -r $s; \
    done
    
  2. Если все идет хорошо, попробуйте без echo.

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        screen -r $s; \
    done
    
  3. Вуаля. Каждый экран, от которого вы отсоединяетесь, переносит вас на следующий.

Приятного просмотра !!

Мо Хоссны
источник
Это ДЕЙСТВИТЕЛЬНО хороший ответ, и это повышает общее качество этого сайта.
123456789123456789123456789
1

Я написал сценарий узла, чтобы позволить пользователю выбрать экранную сессию для присоединения из списка, используя клавиши со стрелками. Я сделал это пакет npm. Вы можете проверить его здесь: экран-команду . Или просто npm i -g screen-commandпопробуйте, если у вас уже установлен node.js. После установки пакета используйте команду scдля вызова списка экранов.

Я надеюсь, что это облегчает переход на нужный экран.

hi94740
источник