Czasami robię takie rzeczy, jak uruchamianie podpowłoki z vima :sh
. Skąd mam wiedzieć, że jestem w podpowłoce, w której exit
zwrócę mnie tylko o jeden poziom, w porównaniu do bycia w najbardziej zewnętrznej powłoce, w której exit
wyloguję się lub zamknę sesję.
Czy istnieje jakiś totem Incepcji, który mogę obrócić, lub coś, aby dowiedzieć się, ile poziomów jestem głęboki?
command-line
Wyck
źródło
źródło
echo $0
. Jeśli jest to powłoka najwyższego poziomu, prawdopodobnie zacznie się od myślnika. (Dotyczy to przynajmniej bash, a myślnik oznacza, że jest to tak zwana powłoka logowania.)Odpowiedzi:
Możesz użyć polecenia
pstree
(domyślnie dostarczanego z Ubuntu). Oto przykład - obecnie mam tylko jedno otwarte okno terminala na WSL:W rzeczywistym środowisku Linux / Ubuntu drzewo procesów będzie bardziej skomplikowane. Możemy przefiltrować drzewo według opcji
-s
, która pokaże rodziców wybranego procesu. Więc naszym poleceniem może byćpstree -s $$
, gdzie$$
jest zmienna środowiskowa, która zawiera bieżący PID:Bibliografia:
Dodaj wskaźnik do zachęty powłoki: na podstawie pomysłu @ waltinator , aby mieć licznik z przodu pytania dla kilku różnych powłok, gdy poziom jest głębszy niż jeden, dodałem linie pokazane poniżej wersji demonstracyjnej, u dołu odpowiednich plików komend uruchamiania (
~/.*rc
).Testowałem na WSL, Ubuntu 16.04, Ubuntu 18.04 (serwer / pulpit), Ubuntu 19.04, w ramach sesji gnome-terminal, tty i ssh. Oto jak to działa:
Ograniczeniem jest to, że: licznik działa tylko dla 13-14 poziomów głębokości, w zależności od systemu operacyjnego. Nie zamierzam badać przyczyn :)
bash
>.bashrc
:csh
itcsh
>.cshrc
:zsh
>.zshrc
:ksh
>.kshrc
:sh
tak naprawdę jestdash
na Ubuntu - tutaj rzeczy są nieco skomplikowane i okablowane (przeczytaj poniższe informacje, aby uzyskać więcej informacji):Edytuj
~/.profile
plik i dodaj następujący wiersz na dole:Utwórz plik
~/.shrc
o następującej treści, uwagaksh
również czyta$ENV
:Bibliografia:
.profile
i.kshrc
Utwórz polecenie, które wyświetli głębokość: Inną opcją jest utworzenie polecenia powłoki, które wyświetli głębokość. W tym celu utwórz plik wykonywalny (dlatego powinien być dostępny dla całego systemu):
/usr/local/bin/depth
Edytuj plik za pomocą swojego ulubionego edytora i dodaj następujące wiersze jako jego zawartość:
Powyższy skrypt ma dwie opcje
-v
lub--verbose
wyświetla listę zaangażowanych powłok. I inna opcja, która sprawdzi, czy głębokość jest większa niż jedna i na tej podstawie powróciexit 0
lubexit 1
, abyś mógł z niej korzystać w ten sposóbdepth && exit
. Oto kilka przykładów użycia:Porównanie z innymi rozwiązaniami: spędziłem trochę czasu, aby dowiedzieć się o słabościach przedstawionych tutaj podejść. Byłem w stanie wyobrazić sobie następujące dwa przypadki (wielkie litery są potrzebne do lepszego podświetlenia składni):
Kiedy
su
lubsudo -i
są zaangażowani:Po uruchomieniu procesu w tle:
źródło
systemd───xfce4-terminal───bash───pstree
. Dlaczego tak jest?xfce4-terminal
, który uruchomiłbash
powłokę, w której działałeśpstree
, która zgłosiła siebie i swoich rodziców. Jeśli masz na myśli brak kroków między systemd a xfce4-terminal, może to oznaczać, że cokolwiek uruchomiony terminal xfce4 umarł lub odrzucił go, w takim przypadku zostałby odziedziczony przez init.SHLVL
? Zakładam, że można przenosić procesy i systemy, ale nie można zainstalować$SHLVL
nie jest obsługiwany przez niektóre muszli. Mówiąc dokładniej, zgodnie ze środowiskiem z powyższej wersji demonstracyjnej nie jest obsługiwany tylko przezsh
(dash
) - i ta powłoka nie jest w ogóle liczona przez tę zmienną. Z drugiej stronypstree
jest częścią pakietu Psmisc który zapewnia równieżfuser
,killall
i kilku innych - jest głównym składnikiem Ubuntu - nie mam zainstalowany w systemach wymienionych w tej odpowiedzi.Sprawdź wartość
SHLVL
zmiennej powłoki:Cytowanie ze
bash
strony podręcznika:Jest również obsługiwany przez
zsh
.źródło
:sh
myślę, że domyślnie jest to powłoka logowania użytkownika (myślę, że jest to w rzeczywistości skrócona forma,:shell
a nie nazwa konkretnego pliku binarnego powłoki):sh
zvim
przed wysłaniem tej odpowiedzi, a nie przyrost poziomu powłoki dla mnie. Moja powłoka logowania to bash.W mojej
.bashrc
używam$SHLVL
do dostosowania$PS1
, dodając+
znaki „ ” do mojej$SUBSHELL
zmiennej:Następnie widzę, jak głęboko jestem:
źródło
awk:
pgrep:
Możesz umieścić jedną z dwóch wersji w pliku i użyć źródła, aby udostępnić $ DEPTH.
źródło
Możesz po prostu użyć
ps
bez dodatkowych argumentów, aby zobaczyć cały stos powłoki (w tym bieżący). Będzie również pokazywał wszystkie zadania w tle, które podjąłeś, a takżeps
siebie, ale może dać przybliżoną ocenę tego, jak głęboko jesteś.źródło
{ echo hello world; ps; } &
aby potwierdzićps
powyższą odpowiedź.