Я хотел бы иметь несколько виртуальных сессий в одном окне замазки и быстро переключаться между ними. Какой лучший способ сделать это? screen
? Я знаю, что могу отсоединиться с помощью ctrl+ad
а затем снова присоединиться к другому сеансу, но, похоже, это много печатает.
5 ответов
Просто для того, чтобы расширить сказанное Ансгаром в случае, если вы не очень хорошо знакомы с экраном 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
Надеюсь, это поможет.
Мэтью
То, что говорят другие, правильно. Я просто хочу упомянуть, что tmux
является альтернативой screen
. У них очень похожие команды.
И screen
и tmux
предлагают несколько окон для запуска сеанса, и это, вероятно, то, что вам нужно.
tmux
дополнительно предлагает переход между несколькими сессиями (каждая из которых имеет свои собственные окна). Тебе это понадобится очень редко.
Вот несколько ссылок на документацию по screen и краткий курс о tmux.
Да, screen
, скорее всего, путь. Ctrl+a , n приведет вас к следующему окну, Ctrl+a , p к предыдущему. Ctrl+a , 0.. 9 позволит вам переключиться на определенный экран.
Через столько времени я создал скрипт, чтобы обойти эту совершенно отсутствующую функцию. Прежде всего, это нужно 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, чтобы выйти.
Вы можете сделать это с помощью простого сценария оболочки, как
for s in `screen -ls | grep Detached | grep <regex to your screen names>`; do screen -r $s; done
Предположим, у вас есть несколько открытых экранов. Предположим также, что вы относите их к категории работы и данных.
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; ...
Применяя
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.
Теперь давайте выделим отдельные экраны с помощью
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)
Теперь давайте выберем те, которые вы хотите (например, данные), снова используя
grep
.screen -ls | grep Detached | grep data
Это изолирует только экраны данных. Вы можете изменить ключевое слово grep с помощью регулярных выражений для поиска, чтобы настроить поиск.
81592.data13 (Detached)
81586.data12 (Detached)
81574.data10 (Detached)
81580.data11 (Detached)
К счастью, результат хорошо структурирован и разделен табуляцией. Теперь давайте разделим столбцы на поля и выберите 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-ыми прежде, чем фактически выполнить это. Я использовалecho screen -r
for s in `screen -ls | \ grep Detached | grep data | \ cut -d' ' -f2`; do \ echo screen -r $s; \ done
Если все идет хорошо, попробуйте это без
echo
.for s in `screen -ls | \ grep Detached | grep data | \ cut -d' ' -f2`; do \ screen -r $s; \ done
Вуаля. Каждый экран, от которого вы отсоединяетесь, приводит вас к следующему.
Приятного просмотра !!