Wenn ich so ein Terminal öffne, bekomme xterm
ich eine Shell. Dann, wenn ich benutze ssh
oder zsh
ich werde eine andere "Ebene" der Shell haben. Gibt es eine Möglichkeit zu wissen, wie oft ich muss Ctrl+D
oder wie oft ich tippe, exit
um 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 screen
auf die Lösung haben.
PS: Bitte zögern Sie nicht, den Titel zu ändern. Ich weiß nicht, ob dies die richtigen Begriffe sind.
ps: illegal option -- -
eine Idee, warum? Ich werde es bald wieder unter Linux testen :)--option-name
ist meistens eine GNU-spezifische Funktion, ist also meistens nicht in Standardsystemdienstprogrammen außerhalb von Linux verfügbar. Sie können den Effekt jedochps --no-headers
portabel erzielen , indem Sie=
nach dem Spaltennamen hinzufügen . Auch diecomm
Spalte ist nicht POSIX, aber diecmd
Spalte (die die Argumente des Befehls enthält) ist. Auch-p
ist notwendig , bevor die PID in POSIX - Syntax. Daherps -o cmd= -p $PPID
ist portabel und gibt ähnliche Informationen.comm
Spalte von POSIX spezifiziert und unter Mac OS X dokumentiert, wohingegen diecmd
Spalte unter Linux vorhanden ist, jedoch kein Standard ist.Sie haben tatsächlich den richtigen Begriff1 gefunden. Es gibt eine Umgebungsvariable,
SHLVL
die alle wichtigen interaktiven Shells (bash, tcsh, zsh) beim Start um 1 erhöht. Wenn Sie also eine Shell innerhalb einer Shell starten, wird sieSHLVL
um 1 erhöht.Dies beantwortet Ihr Anliegen jedoch nicht direkt, da
SHLVL
es Dinge wie Terminalemulatoren überträgt. In meiner typischen Konfiguration$SHLVL
ist z. B. 2 in einem xterm, da Ebene 1 der Shell entspricht, in der meine X-Sitzung (~/.xinitrc
oder~/.xsession
) ausgeführt wird.Was ich tue, ist
$SHLVL
in meiner Eingabeaufforderung anzuzeigen , aber nur, wenn der übergeordnete Prozess der Shell eine andere Shell ist (mit Heuristiken wie "Wenn sein Name mitsh
optionaler 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$$
undps -o tty= -p$PPID
unterschiedliche Ausgaben produzieren. Sie könnenSHLVL
in diesen Shells manuell auf 1 zurücksetzen oder Ihre eigeneTERMSHLVL
in 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
.quelle
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.ps -o tty= -p$$
undps -o tty= -p$PPID
, weil Sie sagten, sie sollten unterschiedliche Ausgaben produzieren. Oder habe ich etwas falsch verstanden?ps -p $$ -p $PPID
(wieder habe ich keine OSX-Erfahrung, also ist vielleicht etwas Ungewöhnliches auf OSX los).ps -p $$ -p $PPID
gibt (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 -bashNicht sehr elegant, aber man konnte verwenden Baumansicht in htop zu Eltern-Kind - Beziehung von Shell zu anderem Laufe proccesses zu sehen.
Und verwenden Sie dies, um die Anzahl der Muscheln abzuleiten, die Sie verlassen müssen, bevor Sie an der "Wurzel" -Schale ankommen
quelle
Sie können die Umgebungsvariable SHLVL verwenden :
quelle
ssh
zB dasselbe Konto verwenden, ist dies immer noch1
Ich finde, dass
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
nohup
Job oder ähnliches verlassen habe.(Auch ich benutze
alias grep='grep --color=auto'
.)quelle