Woher weiß ich, dass ich auf einem Linux-Bildschirm arbeite oder nicht?

60

Der "Bildschirm" bezieht sich auf ein Programm , das unter Herstellen einer Verbindung zu einer getrennten SSH-Sitzung beschrieben wird . Das ist eine gute Einrichtung.

Aber es gibt eine Frage, die ich wirklich gerne wissen würde. Woher weiß ich, ob ich in einem "Bildschirm" laufe? Der Unterschied ist:

  • Wenn ja, weiß ich, dass ich das aktuelle Terminalfenster sicher schließen kann, z. B. ein PuTTY-Fenster, ohne meine Shell-Sitzung (Bash usw.) zu verlieren.
  • Wenn nein, muss ich anstehende Arbeiten erledigen, bevor ich das Terminalfenster schließe.

Besser, ich möchte, dass dieser Status in der PS1-Eingabeaufforderung angezeigt wird, damit ich ihn jederzeit automatisch sehen kann.

Jimm Chen
quelle
3
Wenn Sie tmux anstelle von screen verwenden, wird standardmäßig eine kleine Statusleiste angezeigt. Sie sind für die grundlegende Verwendung ziemlich gleich.
Samuel Edwin Ward
9
Stellen Sie Ihr Totem auf den Tisch und lassen Sie es sich drehen. Wenn es weiter dreht, bist du in Ordnung.
Sonst
Sie können Byobu auch mit screen und tmux verwenden. Es kann so eingerichtet werden, dass es beim Anmelden automatisch geladen wird und durch Drücken der Taste F6 die Verbindung getrennt und abgemeldet wird.
mp3foley
Mögliches Duplikat von Wie überprüfe ich, ob ich in einer Bildschirmsitzung bin?
Andrew Schulman

Antworten:

88

(Gestohlen von " Wie kann ich feststellen, ob ich auf einem Bildschirm bin? " Über StackOverflow und verfasst von Benutzer jho . PS Sie können nicht für ein Duplikat auf allen StackExchange- Websites stimmen.)

Überprüfen Sie $STY. Wenn es null ist, befinden Sie sich in einem "echten" Terminal. Wenn es etwas enthält, ist es der Name des Bildschirms, auf dem Sie sich befinden.

Wenn Sie nicht auf dem Bildschirm sind:

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

Wenn Sie auf dem Bildschirm sind:

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

Wenn Sie tmux anstelle von screen verwenden, überprüfen Sie dies ebenfalls $TMUX. Fügen Sie Folgendes zu Ihrer Eingabeaufforderung hinzu ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi
Wesley
quelle
2
Wenn Sie etwas über das Programm ausführen, werden sudostandardmäßig keine Umgebungsvariablen übernommen, einschließlich $STY. Aber wird typischerweise auf die sudo - Umgebung propagiert, vielleicht so überprüfen Sie entweder oder$TERM $STY $TERM=="screen"
rcoup
14

Suchen Sie nach $STYDetails, screendie für die Kommunikation mit sich selbst verwendet werden. $WINDOWwird dann die aktuelle screenFensternummer sein.

Geekosaurier
quelle
13

Die einfache Prüfung ist ich in der Regel verwenden , um einfach auf Ctrl- a:

  • Wenn der Cursor zum Zeilenanfang springt, befinde ich mich nicht in einer Bildschirmsitzung.

  • Wenn nichts passiert , weiß ich, dass ich mich in einer Bildschirmsitzung befinde und gerade die Bildschirmsteuerungstaste verwendet habe. Ich drücke dann a(springe zum Zeilenanfang), w(zeige aktuelle Bildschirmfenster an) oder führe einen anderen "harmlosen" Bildschirmbefehl aus, um zur Eingabeaufforderung zurückzukehren.

(Dies funktioniert natürlich nur, wenn Sie gerade Bash oder eine andere Software ausführen, die "an den Anfang der Zeile springt", oder wenn Sie die Tastenkombination Strg-a drücken, ist dies äquivalent harmlos.)

Heinzi
quelle
3
Dies funktioniert natürlich nur, wenn die Standard-Strg-A-Taste für die Bildschirmsteuerung aktiviert ist.
ShreevatsaR
1
Wenn Sie die Steuertaste + DD drücken, wird ssh getrennt und beendet. Sie können diese Kombination für mehr Komfort
treffen
Während die Antwort für die eigentliche Frage in Ordnung ist, ist diese Methode nicht skriptfähig.
Nikodemus RIP
7

Nun, die meiste Zeit (wenn jemand nicht versucht, mit Dingen zu schrauben) wird Ihr TERMauf screen(oder zumindest screenirgendwo erwähnen ) eingestellt sein.

Die einfache Lösung des Problems besteht darin, den Bildschirm überall auszuführen. Verlasse das Haus nicht ohne es, sage ich.

womble
quelle
$TERMpflanzt sich auch typischerweise durch sudo, was ein Plus ist!
rcoup
7

Ich behalte dies in meinem .bashrc:

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

Es ist nicht kinderleicht, aber wenn ich einen neuen Bildschirm erstelle, wird die Fensternummer in die Eingabeaufforderung eingefügt. Wenn ich nicht renne screen, gibt es keine Nummer.

Josh
quelle
3

Ich habe einen noch cooleren Weg.

Fügen Sie Folgendes zu Ihrem ~ / .screenrc hinzu, und Sie sehen eine Statuszeile unten (in invertiertem Text Datum, Uhrzeit und Systemlast). Weitere Escape-Codes finden Sie im Manpage-Link unten.

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

Quelle dies, wenn in einer Bildschirmsitzung mit ctrl-a:source ~/.screenrc.

Dafür muss ich mich bei Kyle Rankin vom Linux Journal bedanken. Siehe seinen fantastischen Artikel unter http://www.linuxjournal.com/article/10950 . Den Manpage-Abschnitt, auf den er verweist, finden Sie unter http://www.gnu.org/software/screen/manual/screen.html#String-Escapes .

HankCa
quelle
2

Sie können auch den Prozessbaum von erneut durchsuchen, um festzustellen, $$ob Sie eine Bildschirminstanz finden. Die genaue Kette hängt wahrscheinlich von Ihrem Setup ab - auf meiner OS X-Box hat ein zshInnenbildschirm loginals Elternteil, SCREENals Großelternteil und screenals Urgroßelternteil.

Aaron Davies
quelle