Alternando rapidamente entre sessões virtuais (tela?)

19

Eu gostaria de ter poucas sessões virtuais em uma janela de massa e mudar rapidamente entre elas. Qual é a melhor maneira de fazer isso? screen? Sei que posso me desanexar ctrl+ade reconectar a uma sessão diferente, mas parece muita digitação.

zzz
fonte

Respostas:

22

Apenas para expandir o que Ansgar disse, caso você não esteja muito familiarizado com a tela gnu, ter várias "janelas" em uma única sessão de tela provavelmente realizará o que você precisa.

ctrl+ a, ccriará uma nova "janela" na sua sessão de tela ativa. Você pode alternar entre várias janelas (como Ansgar indicou) com ctrl+ a, npara a próxima janela e ctrl+ a, ppara a janela anterior.

ctrl+ a, "fornecerá uma lista de todas as suas janelas abertas.

O uso desses atalhos fáceis permitirá que você alterne entre diferentes terminais de maneira muito rápida e fácil, atingindo seu objetivo sem usar várias sessões de tela.

Se você adicionar a seguinte linha ao ~ / .screenrc, ela sempre exibirá as janelas abertas e qual está selecionada, para que você não precise manter o controle de qual janela está lembrando.

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

Esta é a linha de hardstatus que eu gosto de usar, mas é completamente personalizável (consulte a página de manual ou pesquise no google por "hardnatus da tela gnu").

Há várias outras coisas que você pode fazer com isso (nomear as diferentes janelas abertas, por exemplo), por isso vale a pena ler alguns tutoriais.

Aqui estão algumas que encontrei com uma pesquisa rápida:

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

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

E, claro, o mais útil de todos:

# From your terminal:
$ man screen

Espero que ajude.

Mateus

Mateus
fonte
2

Sim, screené provavelmente o caminho a percorrer. Ctrl+ a, nlevará você para a próxima janela, Ctrl+ a, ppara a anterior. Ctrl+ a, 0.. 9permitirá que você alterne para uma tela específica.

Ansgar Wiechers
fonte
Você pode configurar combinações de teclas muito mais rápidas, como F11 para anterior, F12 para próxima janela. E altere o caractere de escape da tela de ^apara outra coisa, para que não seja ridiculamente irritante usar a edição de linhas no estilo emacs no bash, qualquer outra coisa. Eu uso ^t.
6606 Peter Cordes
1

O que os outros dizem está correto. Eu só quero mencionar que tmuxé uma alternativa para screen. Eles têm comandos muito semelhantes.

Ambos screene tmuxoferecem várias janelas para uma sessão de corrida, e isso é provavelmente o que você quer. tmuxAlém disso, oferece salto entre várias sessões (cada uma com suas próprias janelas). Você precisaria disso muito raramente.

Aqui estão alguns links para a documentação da tela e um curso intensivo sobre o tmux .

tkruse
fonte
1

Depois de tanto tempo, criei um script para solucionar esse recurso completamente ausente. Antes de tudo, precisa de um fifo:

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

Esse canal nomeado é útil para a comunicação entre a sessão destacada e a sessão "Principal sem tela".

Arquivo sc (em $ 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

Um exemplo de um "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

O resultado é: quando você deseja iniciar o tipo de tela:

sc Monitor

ou outro sessionrc que você gostaria de inventar, eu uso o Session Work para várias coisas

Por exemplo: ~ / .screen / Workrc

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

Agora estamos no Session Monitor, quando digitamos:

sc Work

o monitor da sessão se desconecta e grava "Trabalho" no tubo nomeado. Consequentemente, o primeiro script sc avança e anexa a sessão "Trabalho".
O sc invocado da sessão Monitor close.

Quando desanexamos todas as sessões, estamos em um loop infinito; portanto, precisamos pressionar Ctrl-c para sair.

Thomas8
fonte
1

Você pode fazer isso com um simples shell script como

    for s in `screen -ls | grep Detached | grep <regex to your screen names>`; do screen -r $s; done 
  1. Vamos supor que você tenha poucas telas abertas. Vamos supor também que você os categorize como trabalho e dados.

    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. Aplicando screen -ls, você deve ter telas como esta

    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. Agora vamos isolar as telas desanexadas usando grep.

    screen -ls | grep Detached
    

Você deve obter algo parecido com isto

        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. Agora vamos selecionar os que você deseja (por exemplo, dados), novamente usando grep.

    screen -ls | grep Detached | grep data
    

Isso isolará apenas as telas de dados. Você pode alterar a palavra-chave grep com expressões regulares para pesquisar para personalizar sua pesquisa.

        81592.data13    (Detached)
        81586.data12    (Detached)
        81574.data10    (Detached)
        81580.data11    (Detached)
  1. Felizmente, o resultado é bem estruturado e delimitado por tabulações. Agora vamos dividir as colunas em campos e escolher o segundo campo usando cut.

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

Você precisará pressionar a tecla ctrl+vtab para inserir a tabapós o parâmetro delimitador -d. Os resultados devem ser assim.

81592.data13
81586.data12
81574.data10
81580.data11
  1. Agora coloque isso em um comando usando as ...aspas e faça um loop sobre os resultados como este. Sempre verifique os comandos formulados primeiro antes de executá-lo. eu useiecho screen -r

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        echo screen -r $s; \
    done
    
  2. Se tudo correr bem, tente sem echo.

    for s in `screen -ls | \
    grep Detached | grep data | \
    cut -d'     ' -f2`; do \
        screen -r $s; \
    done
    
  3. Voila. Cada tela da qual você se destaca leva você para a próxima.

Triagem feliz !!

Mo Hossny
fonte
Essa é uma resposta MUITO boa e aumenta a qualidade geral deste site.
123456789123456789123456789
1

Eu escrevi um script de nó para permitir ao usuário selecionar a sessão da tela para anexar a partir de uma lista, usando as teclas de seta. Eu fiz um pacote npm. Você pode conferir aqui: screen-command . Ou apenas npm i -g screen-commandpara experimentá-lo, supondo que você já tenha o node.js instalado. Após instalar o pacote, use o comando scpara convocar a lista de telas.

Espero que isso facilite a mudança para a tela exata desejada.

hi94740
fonte