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.

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.


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.


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”


1

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

echo "$SHLVL"

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'.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.