Come faccio a sapere se sto correndo all'interno di uno "schermo" di Linux o no?


60

La "schermata" si riferisce a un programma menzionato in Come riconnettersi a una sessione ssh disconnessa . Questa è una buona struttura.

Ma c'è una domanda che vorrei davvero sapere. Come faccio a sapere se sto correndo all'interno di uno "schermo"? La differenza è:

  • Se sì, so di poter chiudere in modo sicuro la finestra del terminale corrente, ad es. Chiudere una finestra PuTTY, senza perdere la sessione di shell (Bash ecc.).
  • In caso contrario, so che devo occuparmi di eventuali lavori in sospeso prima di chiudere la finestra del terminale.

Meglio, vorrei che questo stato fosse visualizzato nel prompt di PS1 in modo da poterlo vedere automaticamente in qualsiasi momento.


3
Se si utilizza tmux anziché lo schermo, per impostazione predefinita viene visualizzata una piccola barra di stato. Sono praticamente uguali per l'uso di base.
Samuel Edwin Ward,

9
Posiziona il tuo totem sul tavolo e lascialo girare. Se continua a girare, stai bene. Altrimenti sei in uno schermo:]
Konerak

Puoi anche usare byobu con screen e tmux. Può essere configurato per caricare automaticamente al login e quindi premere il tasto F6 si disconnette e si disconnette.
mp3foley,

Risposte:


88

(Rubato da " Come posso sapere se sono in una schermata? " Su StackOverflow e creato dall'utente jho . PS Non puoi votare un duplicato sui siti StackExchange.)

Controllare $STY. Se è null, sei su un terminale "reale". Se contiene qualcosa, è il nome dello schermo in cui ti trovi.

Se non sei nella schermata:

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

Se sei nella schermata:

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

Se usi tmux anziché lo schermo, controlla anche $TMUX. Per aggiungere questo al tuo prompt, aggiungi quanto segue al tuo ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi

2
se esegui qualcosa tramite sudoesso per impostazione predefinita non erediterà le variabili di ambiente, incluso $STY. Ma in genere viene propagato all'ambiente sudo, quindi forse controlla uno o$TERM $STY $TERM=="screen"
rcoup

14

Cerca $STYquale fornisce i dettagli che screenutilizza per comunicare con se stesso; $WINDOWsarà quindi il screennumero della finestra corrente .


13

Il semplice controllo che di solito uso è semplicemente premere Ctrl- a:

  • Se il cursore si sposta all'inizio della riga , non sono all'interno di una sessione dello schermo.

  • Se non succede nulla , so che sono all'interno di una sessione dello schermo e che ho appena usato il tasto di controllo dello schermo. Quindi premo a(salta all'inizio della riga), w(mostra le finestre dello schermo correnti) o eseguo qualche altro comando "innocuo" per tornare al prompt dei comandi.

(Naturalmente, questo funziona solo se stai eseguendo bash o qualche altro software che "salta all'inizio della linea" o fa qualcosa di altrettanto innocuo quando premi Ctrl-a.)


3
Funziona solo se il tasto di controllo dello schermo viene lasciato sul Ctrl-a predefinito, ovviamente.
ShreevatsaR,

1
premendo il tasto di controllo + DD si staccerebbe e terminerebbe ssh. Puoi colpire quella combinazione per maggiore comodità
akostadinov il

Mentre la risposta va bene per la domanda reale, questo metodo non è programmabile.
Nikodemus RIP

7

Bene, la maggior parte delle volte (in assenza di tentativi di qualcuno di rovinare le cose) la tua TERMvolontà sarà impostata su screen(o almeno menzionata screenda qualche parte).

La semplice soluzione al problema è semplicemente eseguire lo schermo ovunque. Non uscire di casa senza di essa, dico.


$TERMin genere si propaga anche attraverso sudo, il che è un vantaggio!
Recupera il

7

Lo tengo nel mio .bashrc:

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

Non è infallibile, ma ogni volta che creo una nuova schermata, inserisce il numero della finestra nel prompt. Se non sto correndo screen, non c'è numero.


3

Ho un modo ancora più interessante.

Aggiungi quanto segue al tuo ~ / .screenrc e vedrai una linea di stato in fondo (che mostra in testo invertito la data, l'ora e il caricamento del sistema. Altri codici di escape si trovano nel link alla pagina man di seguito.

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

Fonte questo quando in una sessione di schermo con ctrl-a:source ~/.screenrc.

Devo ringraziare Kyle Rankin del Linux Journal per questo. Vedi il suo fantastico articolo su http://www.linuxjournal.com/article/10950 . La sezione della pagina man a cui fa riferimento è disponibile all'indirizzo http://www.gnu.org/software/screen/manual/screen.html#String-Escapes .


2

puoi anche richiamare l'albero del processo $$per vedere se trovi un'istanza dello schermo. la catena esatta dipenderà probabilmente dalla tua configurazione: sul mio riquadro OS X, uno zshschermo interno ha logincome genitore, SCREENnonno e screenbisnonno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.