16

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

5 ответов5

17

Просто для того, чтобы расширить сказанное Ансгаром в случае, если вы не очень хорошо знакомы с экраном 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

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

Мэтью

1

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

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

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

1

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

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

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

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

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

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

sc Work

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .