Manchmal mache ich Dinge wie das Starten einer Sub-Shell von vim mit :sh
. Woher weiß ich, ob ich mich in einer Sub-Shell exit
befinde, in der ich nur eine Ebene zurückgebe, oder in der äußersten Shell, in der exit
ich mich abmelden oder meine Sitzung schließen werde?
Gibt es eine Art Inception-Totem, das ich drehen kann, oder etwas, um zu wissen, wie viele Ebenen ich tief bin?
command-line
Wyck
quelle
quelle
echo $0
. Wenn es sich um die oberste Ebene handelt, beginnt sie wahrscheinlich mit einem Gedankenstrich. (Dies gilt zumindest für Bash, und der Bindestrich bedeutet, dass es sich um eine sogenannte Login-Shell handelt.)Antworten:
Sie können den Befehl verwenden
pstree
(der standardmäßig in Ubuntu enthalten ist). Hier ist ein Beispiel - zur Zeit habe ich nur ein offenes Terminalfenster in der WSL:In einer tatsächlichen Linux / Ubuntu-Umgebung wird der Prozessbaum komplizierter. Wir können den Baum nach der Option filtern, die
-s
die Eltern eines ausgewählten Prozesses anzeigt. Unser Befehl könnte also lautenpstree -s $$
: Wo$$
ist eine Umgebungsvariable, die die aktuelle PID enthält?Verweise:
Hinzufügen eines Indikators zur Shell-Eingabeaufforderung: Basierend auf der Idee des @ Waltinators habe ich die unter der Demo gezeigten Zeilen hinzugefügt, um einen Zähler für mehrere verschiedene Shells vor der Eingabeaufforderung zu haben, wenn das Level tiefer als eins ist. am unteren Rand der entsprechenden run-Anweisungen (
~/.*rc
) -Dateien.Ich habe Tests auf WSL, Ubuntu 16.04, Ubuntu 18.04 (Server / Desktop), Ubuntu 19.04 innerhalb von Gnome-Terminal, Tty und SSH-Sitzung gemacht. So funktioniert das:
Die Einschränkung besteht darin, dass der Zähler je nach Betriebssystem nur für 13-14 Tiefenstufen funktioniert. Ich habe nicht vor, die Gründe zu untersuchen :)
bash
>.bashrc
:csh
undtcsh
>.cshrc
:zsh
>.zshrc
:ksh
>.kshrc
:sh
das ist eigentlichdash
auf Ubuntu - hier sind die Dinge etwas kompliziert und verkabelt (lesen Sie die Referenzen unten für weitere Informationen):Bearbeiten Sie die
~/.profile
Datei und fügen Sie die folgende Zeile unten hinzu:Erstellen Sie die Datei
~/.shrc
mit dem folgenden Inhalt, Hinweisksh
liest auch die$ENV
:Verweise:
.profile
und.kshrc
Erstellen Sie einen Befehl, der die Tiefe ausgibt: Eine andere Option besteht darin, einen Shell-Befehl zu erstellen, der die Tiefe ausgibt. Zu diesem Zweck erstellen Sie die ausführbare Datei (daher sollte sie systemweit zugänglich sein):
/usr/local/bin/depth
Bearbeiten Sie die Datei mit Ihrem bevorzugten Editor und fügen Sie die folgenden Zeilen als Inhalt hinzu:
Das obige Skript hat zwei Optionen
-v
oder--verbose
es wird eine Liste der beteiligten Shells ausgegeben. Und die andere Option, die prüft, ob die Tiefe größer als eins ist und darauf basiert, gibtexit 0
oder zurückexit 1
, sodass Sie sie auf diese Weise verwenden könnendepth && exit
. Hier einige Anwendungsbeispiele:Vergleich mit den anderen Lösungen: Ich habe zusätzliche Zeit aufgewendet, um einige Schwächen der hier vorgestellten Ansätze herauszufinden. Ich konnte mir die folgenden zwei Fälle vorstellen (die Großbuchstaben werden für eine bessere Hervorhebung der Syntax benötigt):
Wann
su
odersudo -i
sind beteiligt:Wenn dort ein Hintergrundprozess gestartet wird:
quelle
systemd───xfce4-terminal───bash───pstree
. Warum ist es so?xfce4-terminal
einebash
Shell, in der Sie gelaufen sindpstree
, die sich und ihre Eltern gemeldet hat. Wenn Sie das Fehlen von Schritten zwischen systemd und xfce4-terminal meinen, könnte es sein, dass das gestartete xfce4-terminal abgestürzt ist oder es nicht mehr gehört. In diesem Fall würde es von init geerbt.SHLVL
? Portabilität über Prozesse und Systeme, nehme ich an, aber dann kann pstree nicht installiert werden.$SHLVL
wird von einigen Shells nicht unterstützt. Genauer gesagt, je nach Umgebung aus der obigen Demo wird es nicht nur vonsh
(dash
) unterstützt - und diese Shell wird von dieser Variablen überhaupt nicht gezählt. Auf der anderen Seitepstree
ist Teil des Pakets psmisc , die auch bietetfuser
,killall
und einige andere - es Hauptbestandteil von Ubuntu ist - ich habe es installiert nicht auf die Systeme in dieser Antwort erwähnt.Überprüfen Sie den Wert der
SHLVL
Shell-Variablen:Zitat aus
bash
der Handbuchseite:Es wird auch von unterstützt
zsh
.quelle
:sh
standardmäßig die Anmeldeshell des Benutzers verwendet (es ist eigentlich eher eine abgekürzte Form:shell
als der Name einer bestimmten Shell-Binärdatei):sh
aus ,vim
bevor dieser Antwort veröffentlichen, und es hat für mich die Shell - Ebene Zuwachs. Meine Login-Shell ist Bash.In my passe
.bashrc
ich$SHLVL
an$PS1
, indem ich "+
" Zeichen an meine$SUBSHELL
Variable anhänge:Dann kann ich sehen, wie tief ich bin:
quelle
awk:
pgrep:
Sie können eine der beiden Versionen in eine Datei einfügen und mit source $ DEPTH verfügbar machen.
quelle
Sie können einfach
ps
ohne zusätzliche Argumente den gesamten Shell-Stack (einschließlich des aktuellen) anzeigen. Es werden auch alle von Ihnen gestarteten Hintergrundjobs sowie sichps
selbst angezeigt, aber es kann Ihnen eine ungefähre Einschätzung darüber geben, wie tief Sie sind.quelle
{ echo hello world; ps; } &
, um dieps
Antwort oben zu beweisen .