Como sei se estou executando dentro de uma "tela" do linux ou não?

60

A "tela" refere-se a um programa mencionado em Como reconectar-se a uma sessão ssh desconectada . Essa é uma boa instalação.

Mas há uma pergunta que eu realmente gostaria de saber. Como sei se estou executando dentro de uma "tela"? A diferença é:

  • Se sim, eu sei que posso fechar com segurança a janela atual do terminal, por exemplo, fechar uma janela PuTTY, sem perder minha sessão do shell (Bash etc.).
  • Se não, sei que tenho que cuidar de quaisquer trabalhos pendentes antes de fechar a janela do terminal.

Melhor, eu gostaria que esse status fosse exibido no prompt do PS1 para que eu possa vê-lo a qualquer momento automaticamente.

Jimm Chen
fonte
3
Se você usa o tmux em vez da tela, você obtém uma pequena barra de status por padrão. Eles são praticamente os mesmos para uso básico.
Samuel Edwin Ward
9
Coloque o seu totem na mesa e deixe-o girar. Se continuar girando, você está bem.
Caso contrário,
Você também pode usar o byobu com screen e tmux. Ele pode ser configurado para carregar automaticamente no logon e pressionar a tecla F6 para desconectar e sair.
Mp3foley
Possível duplicata de Como verificar se estou na sessão de tela?
Andrew Schulman

Respostas:

88

(Roubado de " Como posso saber se estou em uma tela? " No StackOverflow e de autoria do usuário jho . PS Você não pode votar em uma duplicata nos sites do StackExchange.)

Verifique $STY. Se for nulo, você está em um terminal "real". Se ele contiver algo, é o nome da tela em que você está.

Se você não estiver na tela:

eric@dev ~ $ echo $STY
eric@dev ~ $ 

Se você estiver na tela:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

Se você usar o tmux em vez da tela, verifique também $TMUX. Para adicionar isso ao seu prompt, adicione o seguinte ao seu ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi
Wesley
fonte
2
se você executar algo através sudodele, por padrão, não herdará variáveis ​​de ambiente, inclusive $STY. Mas é normalmente propagada para o ambiente sudo, então talvez verificar se quer ou$TERM $STY $TERM=="screen"
rcoup
14

Procure $STYquais fornece detalhes screenusados ​​para se comunicar consigo mesmo; $WINDOWserá então o screennúmero da janela atual .

geekosaur
fonte
13

A verificação simples Eu costumo usar é só apertar Ctrl- a:

  • Se o cursor pular para o início da linha , não estou dentro de uma sessão de tela.

  • Se nada acontecer , sei que estou dentro de uma sessão de tela e que acabei de usar a tecla de controle de tela. Em seguida, pressiono a(pulo para o início da linha), w(mostra as janelas da tela atual) ou executo algum outro comando de tela "inofensivo" para voltar ao prompt de comando.

(Obviamente, isso só funciona se você estiver executando o bash ou algum outro software que "salte para o início da linha" ou faça algo equivalente inofensivo ao pressionar Ctrl-a.)

Heinzi
fonte
3
Isso só funciona se a tecla de controle da tela for deixada no Ctrl-a padrão, é claro.
precisa
11
pressionar a tecla Control + DD desanexaria e encerraria o ssh. Você pode bater essa combinação para maior comodidade
akostadinov
Embora a resposta seja adequada para a pergunta real, esse método não é passível de script.
Nikodemus RIP
7

Bem, na maioria das vezes (na ausência de tentativas de alguém para estragar tudo), você TERMserá definido como screen(ou pelo menos mencionará screenalgum lugar).

A solução fácil para o problema é apenas executar a tela em qualquer lugar. Não saia de casa sem ele, eu digo.

mulher
fonte
$TERMtambém se propaga normalmente sudo, o que é um plus!
Rcoup 15/08/19
7

Eu mantenho isso no meu .bashrc:

 PS1='[\u@\h \W'
 if [ "$WINDOW" ]; then PS1="$PS1 ($WINDOW)"; fi
 PS1="$PS1]$"

Não é infalível, mas sempre que crio uma nova tela, ele coloca o número da janela no prompt. Se não estou correndo screen, não há número.

Josh
fonte
3

Eu tenho um jeito ainda mais legal.

Adicione o seguinte ao seu ~ / .screenrc e você verá uma linha de status na parte inferior (mostrando no texto invertido a data, hora e carga do sistema. Mais códigos de escape encontrados no link da página de manual abaixo.

    hardstatus alwayslastline
    hardstatus string '%Y-%m-%d %c | %l'

Fonte isso quando em uma sessão de tela com ctrl-a:source ~/.screenrc.

Eu tenho que agradecer a Kyle Rankin do Linux Journal por isso. Veja seu artigo fantástico em http://www.linuxjournal.com/article/10950 . A seção da página de manual a que ele se refere pode ser encontrada em http://www.gnu.org/software/screen/manual/screen.html#String-Escapes .

HankCa
fonte
2

você também pode recuar na árvore de processos $$para ver se encontra uma instância de tela. a cadeia exata provavelmente dependerá da sua configuração - no meu OS X box, uma zshtela interna tem logincomo pai, SCREENcomo avós e screencomo bisavós.

Aaron Davies
fonte