O que devo saber para usar o GNU Screen corretamente? [fechadas]


106

Acabei de apresentar o GNU Screen a um amigo e eles estão tendo dificuldade em se acostumar com isso. Isso me faz pensar nas coisas essenciais que ele precisa saber sobre o excelente utilitário Screen , as mesmas coisas que você acha que vale a pena ensinar a alguém, um iniciante, do zero. Quais são algumas analogias e dicas úteis para lembrar de amarras etc.?

Seria maravilhoso.


1
Existem algumas boas respostas para isso também aqui: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris,

Alguém postou uma pergunta semelhante a esta no Server Fault .
Vagnerr

Se alguém está apenas começando e está tendo problemas com o Screen, talvez queira dar uma olhada no tmux alternativo .
Christopher Bottoms,

Respostas:


93

Uso Screenhá mais de 10 anos e provavelmente uso menos da metade dos recursos. Portanto, definitivamente não é necessário aprender todos os seus recursos imediatamente (e eu não recomendo tentar). Meus comandos diários são:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

Eu acho que é isso. Às vezes uso os recursos de tela dividida, mas certamente não diariamente. A outra dica é se a tela parece ter travado porque você pressionou alguma combinação de teclas aleatória por acidente, faça as duas coisas ^Qe ^A ^Qtente destravá-la.


1
^ A k deve ser adicionado à lista para fechar uma janela.
Léo Léopold Hertz 준영

7
Não uso ^ A k devido à possibilidade de matar acidentalmente mais do que pretendo. Em vez disso, eu simplesmente saio do shell em uma janela usando ^ D (ou exit). A janela da tela fecha automaticamente após sair do último shell em uma janela.
Greg Hewgill

9
"^ Um modo de cópia esc, que eu uso para rolar para trás" Você é um deus entre os homens, senhor.
Rob Howard

4
^ A [faz exatamente a mesma coisa.
atx

Obrigado pelo truque de ^ A ^ D ... Eu estava preso e não consegui voltar para minha sessão. Caso isso ajude alguém, escrevi um artigo há um tempo que explica o básico das telas como aqui, mas tem mais alguns truques geekpad.ca/blog/post/…
Patrick Forget

36

Não consegui me acostumar com a tela até encontrar uma maneira de definir uma 'barra de status' na parte inferior da tela que mostra em qual 'guia' ou 'tela virtual' você está e quais outras existem. Aqui está minha configuração:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$

3
Verifique também byobu (perfis de tela): launchpad.net/byobu
Drew Stephens

Isso é incrível, obrigado. Eu estava lutando para descobrir o que realmente estava acontecendo enquanto tentava dividir meu terminal. Não percebi que precisava executar a tela primeiro para fazer qualquer um desses comandos funcionar, bobo, eu sei.
Ogaday

30

Ctrl+ A? - mostre a tela de ajuda!


Concordo plenamente com isso. Isso é muito mais útil do que outras respostas, já que você pode deduzir os outros comandos por ela, mas não pode fazê-lo vice-versa. Também é muito mais fácil lembrar da coisa.
Léo Léopold Hertz 준영

26

Se o seu amigo tem o hábito de pressionar ^Apara chegar ao início da linha no Bash, ele terá algumas surpresas, já que ^Aé a tecla de comando da tela. Normalmente acabo com uma tela congelada, possivelmente por causa de alguma tecla aleatória que pressionei após ^A:-)

Nesses casos eu tento

^A se ^A qbloquear / desbloquear a rolagem do terminal

para consertar isso. Para ir para o início de uma linha dentro da tela, a sequência de teclas é ^A a.


1
É fácil alterar o caractere de escape de ^ A para outra coisa. Coloquei os detalhes na minha resposta.
Andrew Johnson,

3
+ 1 + 1 + 1 ^ A s ... obrigado ... tela bloqueada :)
Yuji 'Tomita' Tomita

1
@agnul +1 para você para ^ A a Sou um usuário de ^ A em uma sessão bash normal e não consigo usá-lo em uma sessão de tela. Obrigado pela ótima dica! :)
icasimpan

Obrigado 100 vezes por me dizer como fazer o ctrl A funcionar dentro da tela. Procurei por isso toda a minha vida.
user674669

As maiúsculas e minúsculas 'A' e 'a' são sensíveis aqui?
Aditya MP de

12

Você pode remapear a tecla escape de Ctrl+ Apara ser outra tecla de sua escolha, então se você a usar para outra coisa, por exemplo, para ir para o início da linha no bash, você só precisa adicionar uma linha ao seu ~ /. arquivo screenrc. Para torná-lo ^ b ou ^ B, use:

escape ^bB

Na linha de comando, use sessões de nomes para manter várias sessões sob controle. Eu uso uma sessão por tarefa, cada uma com várias guias:

  screen -ls # Lista suas sessões de tela atuais
  screen -S <nome> # Cria uma nova sessão de tela chamada nome
  screen -r <name> # Conecta-se às sessões de tela nomeadas

Ao usar a tela, você só precisa de alguns comandos:

  ^ A c Crie uma nova casca
  ^ A [0-9] Switch shell
  ^ A k Mate o shell atual
  ^ A d Desconectar da tela
  ^ A? Mostre a ajuda

Uma excelente referência rápida pode ser encontrada aqui . Vale a pena marcar como favorito.


Eu uso sessões de tela aninhadas. Eu começo o externo com screen -e^oopara que possa usar Ctrl + O para isso e, em seguida, inicio os internos com screen -mpara que iniciem novas sessões.
staticsan

1
Você pode alterar a tecla Escape rapidamente. Em uma sessão de tela em execução, digite ^A :seguido por \Bbseguido de Enter para definir a tecla de escape para ^ B. Em geral, ^A :permite que você avalie o comando que você .screenrcentende.
malana,

8

Algumas dicas para aqueles que estão familiarizados com a tela, mas que tendem a não se lembrar das coisas que lêem na página de manual:

  • Mudar o nome de uma janela de tela é muito fácil: ctrl+ A shift+ A.
  • Você perdeu a última mensagem da tela? ctrl+ a ctrl+ mmostrará novamente para você.
  • Se você quiser executar algo (como seguir um arquivo) e ter a tela informando quando houver uma alteração, use ctrl+ A shift+ mna janela de destino. Aviso: você saberá se houver alguma alteração.
  • Quer selecionar a janela 15 diretamente? Tente estes em seu .screenrcarquivo:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

Isso atribui ctrl+ a shift+ 0 through 9para as janelas 10 a 19.


7

Ctrl+ Aé o comando básico

Ctrl+ A N= ir para a tela *** N *** ext

Ctrl+ A P= ir para a *** P *** tela anterior

Ctrl+ A C= *** C *** ria nova tela

Ctrl+ A D= *** D *** anexe sua tela


6

http://www.debian-administration.org/articles/34

Escrevi isso há alguns anos, mas ainda é uma boa introdução que recebe muitos comentários positivos.


O link está (efetivamente) quebrado:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Peter Mortensen

6

Eu "devo" adicionar isto: adicionar

bind s

para o seu .screenrc, se você - como eu - costumava usar janelas divididas, como C-a Sdivide a janela real, mas C-a scongela. Então, acabei de desabilitar o atalho de congelamento.


2
^-Qdescongela se você acertar^-S
Platão

Você está certo @Plato. Ainda estou trabalhando em ambiente com usuários, que não vão memorizar quase nenhum dos atalhos ... Eu precisava desabilitar.
Zsolt Botykai

NP Acabei de encontrar este tópico primeiro e pesquisei 'congelar' e não encontrei o que estava procurando
Platão

6

Ctrl+ aé uma chave especial.

Ctrl+ a d- [d] etach, deixe os programas (irssi?) em segundo plano, vá para casa.

Ctrl+ a c[c] ria uma nova janela Ctrl+ a 0-9alternar entre as janelas por número

screen -r - volta para a sessão separada

Isso cobre 90% dos casos de uso. Não tente mostrar todas as funcionalidades de uma só vez.


Embora, quando soube disso pela primeira vez, screenfiquei confuso sobre o que realmente significava remover e reconectar uma tela. Citação : "... você pode executar tarefas de longa duração em consoles separados (como ssh em uma máquina remota, sessões de IRC, ...) em uma determinada máquina, desconectar da sessão, mover de um local físico para outro, conectar-se a a máquina por meio de ssh e reconecte à sessão de tela para continuar trabalhando. "
JW.


3

A primeira modificação que faço em .screenrc é alterar o comando de escape. Assim como muitos de vocês, não gosto da sequência padrão Ctrl-A por causa de sua interferência com essa funcionalidade fundamental em quase todos os outros contextos. No meu arquivo .screenrc, adiciono:

escapar `e

Isso é backtick-e.

Isso me permite usar a crase como a tecla de escape (por exemplo, para criar uma nova tela, pressiono crista-c, desanexar é crase-d, crista- é ajuda, crista-crista é a tela anterior, etc.). A única maneira de interferir (e eu tive que me livrar do hábito) é usando crase na linha de comando para capturar a saída da execução ou colando qualquer coisa que contenha crase. Para o primeiro, modifiquei meu hábito usando a convenção BASH $ (comando). Para o último, geralmente apenas abro outro xterm ou desanexo da tela e colo o conteúdo que contém o crase. Finalmente, se eu desejar inserir uma crase literal, simplesmente pressiono crase-e.


brilhante. Eu uso crostas o tempo todo, mesmo sabendo que devo usar $ (...), então agora acho que devo mudar meus métodos. O backtick está um pouco fora do caminho, mas é bom ter uma única tecla sem a necessidade de modificadores. Mas por que "e", e como você se lembra disso?
iconoclasta

Acabei de testar o 'escape' `'e ele funciona bem e parece mais fácil de lembrar. Se você acertar o backtick e não conseguir o que esperava, basta acertar novamente.
iconoclasta

Eu fiz isso, mas existe uma maneira de realmente digitar um crase na tela? Às vezes, é necessário fazer isso, e eu odeio ter que me separar para fazer isso ...
Guillochon

@Guillouchon: o comentário anterior explica exatamente isso.
tripleee

3

Há algum trabalho interessante sendo feito para obter uma boa configuração de tela GNU acontecendo por padrão na próxima versão do Ubuntu Server, que inclui o uso da parte inferior da tela para mostrar todas as janelas, bem como outros detalhes úteis da máquina (como o número de atualizações disponível e se a máquina precisa de uma reinicialização). Você provavelmente pode pegá- .screenrclos e personalizá-los de acordo com suas necessidades.

Os comandos mais úteis que tenho no meu .screenrcsão os seguintes:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

Assim, sempre sei quais janelas estão abertas e o que está funcionando nelas no momento.


3

Eu uso o seguinte para ssh:

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

Em seguida, defino os seguintes aliases de bash:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Ele abre uma nova tela para os aliases acima e iff usando ssh, ele renomeia o título da tela com o nome de host ssh.


2

Gosto de configurar uma sessão de tela com nomes descritivos para as janelas. ^ a A permitirá que você dê um nome para a janela atual e ^ a "lhe dará uma lista de suas janelas. Quando terminar, destaque a tela com ^ ad e reconecte com tela -R


1

Eu gosto de usar screen -d -RRpara criar / anexar automaticamente a uma determinada tela. Criei funções bash para tornar mais fácil ...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

Eles criam um alias para /usr/bin/screen -d -RR -S $name $command. Por exemplo, gosto de usar o irssi em uma sessão de tela, portanto, em meu .bashrc (abaixo dessas funções), tenho:

mkscreen irc /usr/bin/irssi

Então eu posso apenas digitar irc um terminal para entrar no irssi. Se a tela 'irc' ainda não existe, ela é criada e / usr / bin / irssi é executado a partir dela (que se conecta automaticamente, é claro). Se já estiver em execução, simplesmente reconecto-o, desanexando à força qualquer outra instância que já esteja anexada a ele. É muito bom.

Outro exemplo é a criação de aliases de tela temporários para perldocs à medida que os encontro:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

A opção -a (deve ser o primeiro argumento) anexa o alias da tela a .bashrc (portanto, é persistente) e -d o remove (eles podem ser potencialmente destrutivos, portanto, use por sua conta e risco). xD

Acrescentar:

Outro bashismo que acho conveniente ao trabalhar muito com tela:

alias sls='/usr/bin/screen -ls'

Dessa forma, você pode listar suas telas com muito menos teclas. Não sei se slscolide com algum utilitário existente, mas não colidia no momento em meu sistema, então fui em frente.



0

Ctrl+ Aé um ótimo personagem especial para pessoas do Unix, mas se você estiver usando a tela para falar com o OpenVMS , não ser capaz de ^ A vai deixá-lo careca prematuramente.

No VMS , se você estiver editando um comando DCL antes da execução do buffer de histórico, o modo Insert está desligado (deve ser por alguns motivos que não vou entrar aqui) ... para ligá-lo para que você não Para não sobrescrever seu comando em vez de espaçar as coisas, você deve pressionar `^ A.


Eu uso screen -e ^Llpor motivos semelhantes; Eu simplesmente não consigo desaprender a digitar ctrl-A para ir para o início da linha no Emacs. Felizmente, ctrl-L é um pressionamento de tecla que raramente preciso, e também IMHO se conecta muito bem com seu significado geral (redesenhar / limpar tela).
tripleee

@tripleee: My .screenrchas escape ^@^@, que usa o caractere nulo em vez de control-A. Na maioria dos sistemas, você pode inserir o caractere nulo como espaço de controle, que é muito fácil de digitar. (Eu tenho uma sessão de tela aninhada em execução dentro de uma janela na minha sessão principal; para essa eu tenho escape ^]^].)
Keith Thompson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.