Jak poznać „poziom” muszli, w których jestem?

32

Jeśli otworzę terminal, taki jak xtermbędę miał powłokę. Więc jeśli użyję sshlub zshbędę miał inny „poziom” powłoki. Czy istnieje sposób, aby dowiedzieć się, ile razy muszę Ctrl+Dlub pisać, exitaby wyjść z nich wszystkich? Moim prawdziwym zamiarem jest wyjście ze wszystkiego oprócz powłoki „root”.

Miło też będzie wiedzieć, jaki wpływ mają (jak) końcowe multipleksery screenna rozwiązanie.

PS: Nie krępuj się zmienić tytuł, nie wiem, czy są to prawidłowe warunki.

phunehehe
źródło

Odpowiedzi:

6

Jednym (co prawda nie jest idealnym) sposobem jest dodanie wyniku ps --no-headers -o comm $PPIDdo zachęty powłoki. To powie ci nazwę procesu, który zrodził twoją powłokę. Jeśli jesteś w zagnieżdżonym zsh, powie „zsh”. Jeśli znajdujesz się w Zsh najwyższego poziomu, będzie on czytać „xterm” lub „screen” lub cokolwiek, w czym działa twoja powłoka.

Aby stwierdzić, czy jesteś w sesji ssh, czy su, możesz po prostu spojrzeć na nazwę hosta i nazwę użytkownika w wierszu polecenia.

Kiedy uruchamiasz ekrany zagnieżdżone (co nie wydaje mi się, że jest to częsta sytuacja), nie mogę wymyślić, czy jesteś w powłoce najwyższego poziomu zagnieżdżonego ekranu, czy w powłoce najwyższego poziomu ekranu najwyższego poziomu. Możesz skonfigurować ekran tak, aby zawsze wyświetlał linię stanu, co spowodowałoby wyświetlenie wielu linii stanu, jeśli jesteś w zagnieżdżonych ekranach.

sepp2k
źródło
Aaah ... pstryk ... pobij mnie do tego. :) +1
Stefan
Obecnie jestem na komputerze Mac, a polecenie dało mi ps: illegal option -- -jakiś pomysł, dlaczego? Niedługo przetestuję to w systemie Linux :)
phunehehe
3
@phunehehe: --option-namejest głównie cechą specyficzną dla GNU, więc nie jest dostępna w standardowych narzędziach systemowych poza Linuksem. Ale efekt ps --no-headersprzenośności można uzyskać, dodając =po nazwie kolumny. Także commkolumna nie jest POSIX, ale cmdkolumna (która zawiera argumenty polecenia) to. -pJest także konieczne przed PID w składni POSIX. Dlatego ps -o cmd= -p $PPIDjest przenośny i daje podobne informacje.
Gilles „SO- przestań być zły”
potwierdzone, działa na Gentoo
phunehehe 17.10.10
2
@phunehehe: przepraszam, popełniłem błąd w powyższym komentarzu. W rzeczywistości commkolumna jest określona przez POSIX i udokumentowana w systemie Mac OS X, podczas gdy cmdkolumna istnieje w systemie Linux, ale nie jest standardowa.
Gilles „SO- przestań być zły”
37

W rzeczywistości trafiłeś na właściwy termin¹. Istnieje zmienna środowiskowa, SHLVLktórej wszystkie główne interaktywne powłoki (bash, tcsh, zsh) zwiększają o 1 podczas uruchamiania. Więc jeśli uruchomisz powłokę wewnątrz skorupy, SHLVLzwiększy się o 1.

Nie odpowiada to jednak bezpośrednio na twoje obawy, ponieważ SHLVLprzenosi takie rzeczy jak emulatory terminali. Na przykład w mojej typowej konfiguracji $SHLVLjest 2 w xterm, ponieważ poziom 1 odpowiada powłoce, która uruchamia moją sesję X ( ~/.xinitrclub ~/.xsession).

To, co robię, to wyświetlenie $SHLVLw wierszu polecenia, ale tylko wtedy, gdy proces macierzysty powłoki jest inną powłoką (z heurystyką typu „jeśli jej nazwa kończy się na shplus interpunkcja i cyfry, to powłoka”). W ten sposób mam wyraźne wskazanie wizualne w rzadkim przypadku pocisku działającego pod inną powłoką.

Być może wolisz wykryć powłoki działające bezpośrednio pod emulatorem terminala. Możesz to zrobić dość dokładnie: są to powłoki, których proces macierzysty ma inny terminal kontrolny, więcps -o tty= -p$$ i ps -o tty= -p$PPIDprodukować innego wyjścia. Możesz ręcznie zresetować SHLVLdo 1 w tych powłokach lub ustawić własny TERMSHLVLna 1 w tych powłokach (w innym przypadku zwiększyć).

¹ Chociaż nie można by pomyśleć, że patrzy się na strony podręcznika: żadna z trzech powłok, które ją obsługują, nie zawiera słowa „poziom” w ich dokumentacji SHLVL.

Gilles „SO- przestań być zły”
źródło
Dziękujemy za potwierdzenie terminu. Nadal jestem na komputerze Mac i jestem zaskoczony, że te 2 polecenia dają ten sam wynik, niezależnie od poziomu mojej powłoki.
phunehehe
@phunehehe: jakie 2 polecenia? Jeśli masz na myśli ps -o tty= -p$pid, pokazuje terminal kontrolny procesu, który identyfikuje emulator terminala (xterm, screen, sshd,…), w którym działa proces. Nie zmieni się, jeśli uruchomisz powłokę z innej powłoki, ale zmieni się, jeśli uruchom nowy emulator terminala. Jeśli emulator terminala jest natywną aplikacją dla komputerów Mac, może istnieć subtelność specyficzna dla komputerów Mac, której nie jestem świadomy.
Gilles 'SO - przestań być zły'
ps -o tty= -p$$ i ps -o tty= -p$PPID ponieważ powiedziałeś, że powinny one wytwarzać różne wyniki. A może coś źle zrozumiałem?
phunehehe
@phunehehe: Dają różne dane wyjściowe, gdy proces macierzysty powłoki jest emulatorem terminala, ponieważ emulator terminala nie ma emulowanego terminala jako terminala sterującego. Jeśli okaże się inaczej, proszę opublikować wyjście ps -p $$ -p $PPID(ponownie, nie mam doświadczenia w OSX, więc może dzieje się coś niezwykłego w OSX).
Gilles „SO- przestań być zły”
@Gilles: to było rzeczywiście coś niezwykłego w OSX. Testowałem na Gentoo i wszystko było w porządku, jak powiedziałeś. W OSX ps -p $$ -p $PPIDdaje (przepraszam, nie wiem jak sformatować komentarze) PID TTY TIME CMD 209 ttys000 0: 00.01 login -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe 17.10.10
1

Niezbyt elegancki, ale możesz użyć widoku drzewa w htopie, aby zobaczyć relację rodzic-dziecko swojej powłoki do innych uruchomionych procesów.

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

I użyj tego, aby wydedukować ilość pocisków, które musisz wyjść, zanim dotrzesz do powłoki „root”

Stefan
źródło
1

Możesz użyć zmiennej środowiskowej SHLVL :

echo "$SHLVL"
Alex
źródło
1
Jeśli użyjesz sshnp. Tego samego konta, nadal będzie to1
Anthon
0

Znajduję to

$ pstree -u | grep ${USER}

może być bardzo pomocny w sprawdzeniu, gdzie „pasuję” do systemu. Wolę to niż pstree -u ${USER}.

Czasami przypomina mi to, że zostawiłem nohup pracę lub podobnego.

(Również używam alias grep='grep --color=auto'.)

J_H
źródło