Woher weiß ich, in welchem ​​„Level“ der Muscheln ich mich befinde?

32

Wenn ich so ein Terminal öffne, bekomme xtermich eine Shell. Dann, wenn ich benutze sshoder zshich werde eine andere "Ebene" der Shell haben. Gibt es eine Möglichkeit zu wissen, wie oft ich muss Ctrl+Doder wie oft ich tippe, exitum alle zu beenden? Meine eigentliche Absicht ist es, alles außer der "root" Shell zu beenden.

Es wird auch interessant sein zu wissen, welche Auswirkungen (wie) Terminal-Multiplexer screenauf die Lösung haben.

PS: Bitte zögern Sie nicht, den Titel zu ändern. Ich weiß nicht, ob dies die richtigen Begriffe sind.

phunehehe
quelle

Antworten:

6

Eine (zugegebenermaßen nicht perfekte) Möglichkeit besteht darin, das Ergebnis von ps --no-headers -o comm $PPIDzu Ihrer Shell-Eingabeaufforderung hinzuzufügen . Hier erfahren Sie den Namen des Prozesses, der Ihre Shell ausgelöst hat. Wenn Sie sich in einem verschachtelten zsh befinden, wird "zsh" angezeigt. Wenn Sie sich in einem zsh der obersten Ebene befinden, wird "xterm" oder "screen" oder was auch immer auf Ihrer Shell ausgeführt wird, angezeigt.

Um festzustellen, ob Sie sich in einer ssh- oder su-Sitzung befinden, können Sie einfach den Hostnamen- und den Benutzernamen-Teil Ihrer Eingabeaufforderung überprüfen.

Wenn Sie verschachtelte Bildschirme ausführen (was meines Erachtens keine alltägliche Situation ist), kann ich mir nicht vorstellen, ob Sie sich in der obersten Ebene eines verschachtelten Bildschirms oder in der obersten Ebene befinden des Bildschirms der obersten Ebene. Sie können den Bildschirm so konfigurieren, dass immer eine Statuszeile angezeigt wird, wodurch mehrere Statuszeilen angezeigt werden, wenn Sie sich in verschachtelten Bildschirmen befinden.

sepp2k
quelle
Aaah ... schnapp .. schlag mich drauf. :) +1
Stefan
Derzeit bin ich auf einem Mac und der Befehl gab mir ps: illegal option -- -eine Idee, warum? Ich werde es bald wieder unter Linux testen :)
phunehehe
3
@phunehehe: --option-nameist meistens eine GNU-spezifische Funktion, ist also meistens nicht in Standardsystemdienstprogrammen außerhalb von Linux verfügbar. Sie können den Effekt jedoch ps --no-headersportabel erzielen , indem Sie =nach dem Spaltennamen hinzufügen . Auch die commSpalte ist nicht POSIX, aber die cmdSpalte (die die Argumente des Befehls enthält) ist. Auch -pist notwendig , bevor die PID in POSIX - Syntax. Daher ps -o cmd= -p $PPIDist portabel und gibt ähnliche Informationen.
Gilles 'SO- hör auf böse zu sein'
bestätigt, arbeitet an Gentoo
phunehehe 17.10.10
2
@phunehehe: sorry, ich habe im obigen kommentar einen fehler gemacht. Tatsächlich wird die commSpalte von POSIX spezifiziert und unter Mac OS X dokumentiert, wohingegen die cmdSpalte unter Linux vorhanden ist, jedoch kein Standard ist.
Gilles 'SO - hör auf, böse zu sein'
37

Sie haben tatsächlich den richtigen Begriff1 gefunden. Es gibt eine Umgebungsvariable, SHLVLdie alle wichtigen interaktiven Shells (bash, tcsh, zsh) beim Start um 1 erhöht. Wenn Sie also eine Shell innerhalb einer Shell starten, wird sie SHLVLum 1 erhöht.

Dies beantwortet Ihr Anliegen jedoch nicht direkt, da SHLVLes Dinge wie Terminalemulatoren überträgt. In meiner typischen Konfiguration $SHLVList z. B. 2 in einem xterm, da Ebene 1 der Shell entspricht, in der meine X-Sitzung ( ~/.xinitrcoder ~/.xsession) ausgeführt wird.

Was ich tue, ist $SHLVLin meiner Eingabeaufforderung anzuzeigen , aber nur, wenn der übergeordnete Prozess der Shell eine andere Shell ist (mit Heuristiken wie "Wenn sein Name mit shoptionaler Interpunktion und Ziffern endet , ist es eine Shell"). Auf diese Weise habe ich einen offensichtlichen visuellen Hinweis für den seltenen Fall, dass eine Shell unter einer anderen Shell ausgeführt wird.

Vielleicht möchten Sie lieber Shells erkennen, die direkt unter einem Terminalemulator ausgeführt werden. Sie können dies ziemlich genau tun: Dies sind die Shells, deren übergeordneter Prozess ein anderes steuerndes Terminal hat, so dass ps -o tty= -p$$und ps -o tty= -p$PPIDunterschiedliche Ausgaben produzieren. Sie können SHLVLin diesen Shells manuell auf 1 zurücksetzen oder Ihre eigene TERMSHLVLin diesen Shells auf 1 setzen (und ansonsten erhöhen).

¹ Auch wenn man es sich auf den Manualseiten nicht vorstellen würde: Keine der drei Shells, die dies unterstützen, enthält das Wort „Level“ in ihrer Dokumentation von SHLVL.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank für die Bestätigung der Laufzeit. Ich bin immer noch auf einem Mac und bin überrascht, dass diese beiden Befehle unabhängig von meinem Shell-Level das gleiche Ergebnis liefern.
Phunehehe
@phunehehe: welche 2 befehle? Wenn Sie meinen ps -o tty= -p$pid, zeigt dies das steuernde Terminal des Prozesses an, das den Terminalemulator (xterm, screen, sshd, ...) identifiziert, in dem der Prozess ausgeführt wird. Es ändert sich nicht, wenn Sie eine Shell von einer anderen Shell starten, aber wenn Sie es ändern Starten Sie einen neuen Terminal-Emulator. Wenn es sich bei dem Terminalemulator um eine native Mac-Anwendung handelt, ist mir möglicherweise keine Mac-spezifische Feinheit bekannt.
Gilles 'SO- hör auf böse zu sein'
ps -o tty= -p$$ und ps -o tty= -p$PPID , weil Sie sagten, sie sollten unterschiedliche Ausgaben produzieren. Oder habe ich etwas falsch verstanden?
Phunehehe
@phunehehe: Sie geben unterschiedliche Ausgaben aus, wenn der übergeordnete Prozess der Shell ein Terminalemulator ist, da der Terminalemulator kein emuliertes Terminal als steuerndes Terminal hat. Wenn Sie etwas anderes finden, posten Sie bitte die Ausgabe von ps -p $$ -p $PPID(wieder habe ich keine OSX-Erfahrung, also ist vielleicht etwas Ungewöhnliches auf OSX los).
Gilles 'SO - hör auf böse zu sein'
@ Gilles: das war in der Tat etwas ungewöhnliches mit OSX. Ich habe auf Gentoo getestet und alles war korrekt, wie Sie sagten. Auf OSX ps -p $$ -p $PPIDgibt (sorry, ich weiß nicht, wie man Kommentare formatiert) PID TTY TIME CMD 209 ttys000 0: 00.01 Login -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe
1

Nicht sehr elegant, aber man konnte verwenden Baumansicht in htop zu Eltern-Kind - Beziehung von Shell zu anderem Laufe proccesses zu sehen.

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

Und verwenden Sie dies, um die Anzahl der Muscheln abzuleiten, die Sie verlassen müssen, bevor Sie an der "Wurzel" -Schale ankommen

Stefan
quelle
1

Sie können die Umgebungsvariable SHLVL verwenden :

echo "$SHLVL"
Alex
quelle
1
Wenn Sie sshzB dasselbe Konto verwenden, ist dies immer noch1
Anthon
0

Ich finde, dass

$ pstree -u | grep ${USER}

kann sehr hilfreich sein, um zu sehen, wo ich in ein System "passe". Ich ziehe es vor pstree -u ${USER}.

Gelegentlich wird es mich daran erinnern, dass ich einen nohupJob oder ähnliches verlassen habe.

(Auch ich benutze alias grep='grep --color=auto'.)

J_H
quelle