Szybkie przełączanie między sesjami wirtualnymi (ekran?)

19

Chciałbym mieć kilka wirtualnych sesji w jednym oknie kitu i szybko się między nimi przełączać. Jak najlepiej to zrobić? screen? Wiem, że mogę się odłączyć, ctrl+ada następnie ponownie dołączyć do innej sesji, ale wydaje się, że to dużo pisania.

zzz
źródło

Odpowiedzi:

22

Aby rozwinąć to, co powiedział Ansgar w przypadku, gdy nie jesteś zbyt zaznajomiony z ekranem GNU, posiadanie wielu „okien” w sesji jednego ekranu prawdopodobnie spełni twoje oczekiwania.

ctrl+ a, cutworzy nowe „okno” w aktywnej sesji ekranu. Możesz przełączać się między wieloma oknami (jak wskazano w Ansgar) za pomocą ctrl+ a, ndla następnego okna i ctrl+ a, pdla poprzedniego okna.

ctrl+ a, "wyświetli listę wszystkich otwartych okien.

Korzystanie z tych prostych skrótów pozwala szybko i łatwo przełączać się między różnymi terminalami, osiągając cel bez konieczności korzystania z wielu sesji ekranowych.

Jeśli dodasz następujący wiersz do ~ / .screenrc, zawsze wyświetli on twoje otwarte okna i które z nich jest zaznaczone, więc nie musisz śledzić, w którym oknie zapamiętasz.

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

Jest to linia hardstatus, której lubię używać, ale można ją całkowicie dostosować (zobacz stronę podręcznika man lub wyszukaj w Google hasło „gnu screen hardstatus”).

Jest mnóstwo innych rzeczy, które możesz z tym zrobić (na przykład nazywając różne otwarte okna), więc warto przeczytać kilka samouczków.

Oto kilka, które znalazłem dzięki szybkiemu wyszukiwaniu:

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

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

I oczywiście najbardziej przydatne ze wszystkich:

# From your terminal:
$ man screen

Mam nadzieję, że to pomaga.

Mateusz

Mateusz
źródło
2

Tak, screennajprawdopodobniej jest to najlepsza droga. Ctrl+ a, nprzeniesie Cię do następnego okna, Ctrl+ a, pdo poprzedniego. Ctrl+ a, 0.. 9pozwoli Ci przejść do określonego ekranu.

Ansgar Wiechers
źródło
Możesz skonfigurować znacznie szybsze skróty klawiszowe, takie jak F11 dla poprzedniej wersji, F12 dla następnego okna. I zmień znak ucieczki z ekranu ^ana coś innego, więc nie jest śmiesznie denerwujące korzystanie z edycji linii w stylu emacsa w bash, cokolwiek innego. Używam ^t.
Peter Cordes,
1

To, co mówią inni, jest poprawne. Chcę tylko wspomnieć, że tmuxjest alternatywą dla screen. Mają bardzo podobne polecenia.

Zarówno screeni tmuxoferują wiele okien dla działającej sesji, a to jest chyba to, co chcesz. tmuxdodatkowo oferuje przechodzenie między wieloma sesjami (każda z nich ma własne okna). Bardzo rzadko byś tego potrzebował.

Oto kilka linków do dokumentacji ekranu i kursu awaryjnego na temat tmux .

tkruse
źródło
1

Po tak długim czasie stworzyłem skrypt, aby obejść tę całkowicie brakującą funkcję. Po pierwsze potrzebuje piątki:

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

Ten nazwany potok jest użyteczny do komunikacji między odłączoną sesją a sesją „Main-without-screen”.

Plik sc (w $ 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

Przykładem „CONFIGFILE” jest: ~ / .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

Wynik jest następujący: gdy chcesz uruchomić typ ekranu:

sc Monitor

lub inną sesję, którą lubisz wymyślać, używam Session Work do różnych rzeczy

Np .: ~ / .screen / Workrc

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

Teraz jesteśmy w Monitorze sesji, kiedy piszemy:

sc Work

Monitor sesji odłącza się i zapisuje „Work” na nazwanej rurze. W związku z tym pierwszy skrypt sc idzie do przodu i dołącza sesję „Work”.
Sc wywołany z Monitora sesji zamknij.

Kiedy odłączamy wszystkie sesje, jesteśmy w nieskończonej pętli, więc musimy nacisnąć Ctrl-c, aby wyjść.

Thomas8
źródło
1

Możesz to zrobić za pomocą prostego skryptu powłoki, takiego jak

    for s in `screen -ls | grep Detached | grep <regex to your screen names>`; do screen -r $s; done 
  1. Załóżmy, że masz kilka otwartych ekranów. Załóżmy również, że masz je sklasyfikowane jako praca i dane.

    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. Aplikując screen -ls, powinieneś mieć takie ekrany

    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. Teraz pozwala izolować odłączone ekrany za pomocą grep.

    screen -ls | grep Detached
    

Powinieneś dostać coś takiego

        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. Teraz pozwala wybrać te, które chcesz (np. Dane), ponownie za pomocą grep.

    screen -ls | grep Detached | grep data
    

Spowoduje to odizolowanie tylko ekranów danych. Możesz zmienić słowo kluczowe grep za pomocą wyrażeń regularnych, aby wyszukiwać, aby dostosować wyszukiwanie.

        81592.data13    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81580.data11    (Detached)
  1. Na szczęście wynik jest dobrze skonstruowany i rozdzielany tabulatorami. Teraz pozwala podzielić kolumny na pola i wybrać 2. pole za pomocą cut.

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

Będziesz musiał nacisnąć, ctrl+va następnie Tab, aby wstawić tabparametr za separatorem -d. Wyniki powinny być takie.

81592.data13
81586.data12
81574.data10
81580.data11
  1. Teraz spakuj to do polecenia, używając ...cudzysłowów i zapętlaj wyniki w ten sposób. Zawsze sprawdzaj sformułowane polecenia 1. przed ich uruchomieniem. użyłemecho screen -r

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        echo screen -r $s; \
    done
    
  2. Jeśli wszystko pójdzie dobrze, spróbuj tego bez echo.

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        screen -r $s; \
    done
    
  3. Voila Każdy ekran, z którego się odłączysz, prowadzi do następnego.

Miłego pokazu !!

Mo Hossny
źródło
To jest NAPRAWDĘ fajna odpowiedź i podnosi ogólną jakość tej strony.
123456789123456789123456789
1

Napisałem skrypt węzła, który pozwala użytkownikowi wybrać sesję ekranu, do której chcesz dołączyć z listy, używając klawiszy strzałek. Zrobiłem to pakiet npm. Możesz to sprawdzić tutaj: screen-command . Lub po prostu npm i -g screen-commandwypróbuj, zakładając, że masz już plik node.js. Po zainstalowaniu pakietu użyj polecenia, scaby przywołać listę ekranów.

Mam nadzieję, że ułatwi to przejście do dokładnie tego ekranu, który chcesz.

hi94740
źródło