.png)
Я хотел бы иметь несколько виртуальных сессий в одном окне putty и быстро переключаться между ними. Как лучше всего это сделать? screen
? Я знаю, что могу отсоединиться ctrl+ad
и затем снова подключиться к другой сессии, но это, похоже, требует много ввода текста.
решение1
Просто чтобы расширить то, что сказал Ансгар, на случай, если вы не очень хорошо знакомы с GNU Screen, наличие нескольких «окон» в одном сеансе экрана, скорее всего, достигнет того, что вам нужно.
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позволит вам переключиться на определенный экран.
решение3
После стольких лет я сделал скрипт, чтобы обойти эту полностью отсутствующую функцию. Прежде всего, ему нужен fifo:
mkdir ~/.screen
mkfifo ~/.screen/pipe
Этот именованный канал полезен для связи между отсоединенным сеансом и сеансом «Main-without-screen».
Файлподкожно(в $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
или другой sessionrc, который вам нравится изобретать, я использую Session Work для разных вещей
Пример: ~/.screen/Workrc
layout new Work
screen -t "bash" bash --login
Теперь мы находимся в мониторе сеанса и вводим:
sc Work
сеанс Monitor отсоединяется и записывает "Work" в namedpipe. Соответственно, первый скрипт sc переходит вперед и присоединяет сеанс "Work".
Вызванный из сеанса Monitor sc закрывается.
Когда мы отсоединяем все сеансы, мы попадаем в бесконечный цикл, поэтому для выхода нам приходится нажимать Ctrl-c.
решение4
Вы можете сделать это с помощью простого скрипта оболочки, например:
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)
К счастью, результат хорошо структурирован и разделен табуляцией. Теперь давайте разделим столбцы на поля и выберем второе поле с помощью
cut
.screen -ls | grep Detached | grep data | cut -d' ' -f2
Вам нужно будет нажать ctrl+v
клавишу Tab, чтобы вставить a tab
после параметра-разделителя -d
. Результаты должны быть такими.
81592.data13
81586.data12
81574.data10
81580.data11
Теперь упакуйте это в команду, используя
...
кавычки, и выполните цикл по результатам, как здесь. Всегда проверяйте сформулированные команды перед тем, как фактически запустить их. Я использовал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
Вуаля. Каждый экран, от которого вы отрываетесь, переносит вас на следующий.
Приятного просмотра!!