Jeśli otworzę terminal, taki jak xterm
będę miał powłokę. Więc jeśli użyję ssh
lub zsh
będę miał inny „poziom” powłoki. Czy istnieje sposób, aby dowiedzieć się, ile razy muszę Ctrl+D
lub pisać, exit
aby 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 screen
na rozwiązanie.
PS: Nie krępuj się zmienić tytuł, nie wiem, czy są to prawidłowe warunki.
ps: illegal option -- -
jakiś pomysł, dlaczego? Niedługo przetestuję to w systemie Linux :)--option-name
jest głównie cechą specyficzną dla GNU, więc nie jest dostępna w standardowych narzędziach systemowych poza Linuksem. Ale efektps --no-headers
przenośności można uzyskać, dodając=
po nazwie kolumny. Takżecomm
kolumna nie jest POSIX, alecmd
kolumna (która zawiera argumenty polecenia) to.-p
Jest także konieczne przed PID w składni POSIX. Dlategops -o cmd= -p $PPID
jest przenośny i daje podobne informacje.comm
kolumna jest określona przez POSIX i udokumentowana w systemie Mac OS X, podczas gdycmd
kolumna istnieje w systemie Linux, ale nie jest standardowa.W rzeczywistości trafiłeś na właściwy termin¹. Istnieje zmienna środowiskowa,
SHLVL
któ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,SHLVL
zwiększy się o 1.Nie odpowiada to jednak bezpośrednio na twoje obawy, ponieważ
SHLVL
przenosi takie rzeczy jak emulatory terminali. Na przykład w mojej typowej konfiguracji$SHLVL
jest 2 w xterm, ponieważ poziom 1 odpowiada powłoce, która uruchamia moją sesję X (~/.xinitrc
lub~/.xsession
).To, co robię, to wyświetlenie
$SHLVL
w wierszu polecenia, ale tylko wtedy, gdy proces macierzysty powłoki jest inną powłoką (z heurystyką typu „jeśli jej nazwa kończy się nash
plus 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ęc
ps -o tty= -p$$
ips -o tty= -p$PPID
produkować innego wyjścia. Możesz ręcznie zresetowaćSHLVL
do 1 w tych powłokach lub ustawić własnyTERMSHLVL
na 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
.źródło
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.ps -o tty= -p$$
ips -o tty= -p$PPID
ponieważ powiedziałeś, że powinny one wytwarzać różne wyniki. A może coś źle zrozumiałem?ps -p $$ -p $PPID
(ponownie, nie mam doświadczenia w OSX, więc może dzieje się coś niezwykłego w OSX).ps -p $$ -p $PPID
daje (przepraszam, nie wiem jak sformatować komentarze) PID TTY TIME CMD 209 ttys000 0: 00.01 login -pf phunehehe 210 ttys000 0: 00.12 -bashNiezbyt elegancki, ale możesz użyć widoku drzewa w htopie, aby zobaczyć relację rodzic-dziecko swojej powłoki do innych uruchomionych procesów.
I użyj tego, aby wydedukować ilość pocisków, które musisz wyjść, zanim dotrzesz do powłoki „root”
źródło
Możesz użyć zmiennej środowiskowej SHLVL :
źródło
ssh
np. Tego samego konta, nadal będzie to1
Znajduję to
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'
.)źródło