İçinde bulunduğum mermilerin “seviyesini” nasıl öğrenirim?


32

Eğer böyle bir terminal açarsam xtermbir kabuğum olur. O zaman kullanırsam sshveya zshbaşka bir "kabuk" seviyesine sahip olurum. Onlardan kaç kez çıkmam gerektiğini Ctrl+Dveya yazmam gerektiğini bilmenin bir yolu var mı exit? Asıl amacım "root" kabuğu dışındaki her şeyden çıkmak.

Ayrıca, terminal çoklayıcıların (benzerlerinin screen) çözelti üzerindeki etkilerini bilmek de güzel olacaktır .

Not: Lütfen başlığı değiştirmekten çekinmeyin, doğru terimlerin olup olmadığını bilmiyorum.

Yanıtlar:


6

Kuşkusuz mükemmel bir yoldan biri ps --no-headers -o comm $PPID, kabuğuna istediğin sonucu eklemektir . Bu size kabuğunuzu oluşturan sürecin adını söyleyecektir. İç içe bir zsh içerisindeyseniz, "zsh" yazacaktır. Üst düzey bir zsh içerisindeyseniz, "xterm" veya "ekran" veya kabuğunuzun içinde çalıştığı her şeyi okuyacaktır.

Bir ssh veya su oturumunda olup olmadığınızı söylemek için, isteminizin ana bilgisayar adına ve kullanıcı adı bölümüne bakabilirsiniz.

Yuvalanmış ekranlar çalıştırırken (bu benim için genel bir durum değildir), yuvalanmış bir ekranın üst düzey kabuğunda mı, yoksa üst düzey kabuk içinde olduğunuzu söylememin hiçbir yolu yoktur. Üst seviye ekranın Ekranı, her zaman iç içe geçmiş ekranlardaysanız, birden fazla durum satırının görüntülenmesine neden olacak bir durum satırı görüntüleyecek şekilde yapılandırabilirsiniz.


Aaah ... yakala .. beni döv. :) +1
Stefan

Şu anda bir mac üzerinde ve komut bana verdi ps: illegal option -- -, herhangi bir fikir neden? Yakında tekrar Linux'ta
deneyeceğim

3
@phunehehe: --option-nameçoğunlukla GNU'ya özgü bir özelliktir, bu nedenle çoğunlukla Linux dışındaki standart sistem uygulamalarında mevcut değildir. Ancak sütun adından sonra ps --no-headersekleyerek taşınabilir bir etki elde edebilirsiniz =. Ayrıca commsütun POSIX değil, cmdsütun (komutun argümanlarını içeren). -pPOSIX sözdiziminde PID'den önce de gereklidir. Dolayısıyla ps -o cmd= -p $PPIDtaşınabilir ve benzer bilgiler verir.
Gilles 'SO- kötülük yapmayı bırak'

onaylandı, Gentoo'da çalışıyor
phunehehe

2
@phunehehe: Üzgünüm, yukarıdaki yorumda bir hata yaptım. Aslında, commsütun POSIX tarafından belirtilmiş ve Mac OS X'te belgelenmiştir, buna karşın cmdsütun Linux üzerinde bulunmaktadır ancak standart değildir.
Gilles 'SO- kötülük' dur

37

Aslında doğru terime isabet ettin have. SHLVLTüm büyük etkileşimli mermilerin (bash, tcsh, zsh) başladığında 1 oranında arttığı bir ortam değişkeni vardır. Yani bir kabuk içinde bir kabuk başlatırsanız, SHLVL1 artar.

Bununla birlikte, bu doğrudan endişelerinize cevap vermez, çünkü SHLVLterminal emülatörleri gibi şeyleri taşır. Örneğin, tipik yapılandırmamda, $SHLVLxterm'de 2'dir, çünkü seviye 1 X oturumumu çalıştıran kabuğa karşılık gelir ( ~/.xinitrcveya ~/.xsession).

Yaptığım $SHLVL, benim istekte göstermem, ancak yalnızca kabuğun ana işlemi başka bir kabuksa (“adı shartı isteğe bağlı noktalama ve rakamlarla bitiyorsa , bir kabuk” gibi) sezgisel tarama ile ). Bu şekilde, başka bir kabuğun altında akan bir kabuğun nadir durumunda açık bir görsel endikasyonum var.

Belki de doğrudan bir terminal emülatörünün altında çalışan mermileri tespit etmeyi tercih edersiniz. Böylece, bu kimin ana süreç farklı bir kontrol terminali vardır kabukları şunlardır: Sen oldukça doğru yapabilirsiniz ps -o tty= -p$$ve ps -o tty= -p$PPIDfarklı bir çıktı oluşturmak. SHLVLBu mermilerde manuel olarak 1'e sıfırlayabilir veya bu mermilerde kendiniz TERMSHLVL1 olarak ayarlayabilirsiniz (ve aksi takdirde artırılabilir).

¹ kimse manuel sayfalarına bakarak düşünmek olmaz rağmen: bunu destekleyecek üç kabukları hiçbiri kendi belgelerinde sözcüğü “seviye” include SHLVL.


Terimi onayladığınız için teşekkürler. Hala bir mac'tayım ve bu 2 komutun, kabuk seviyem ne olursa olsun aynı sonucu verdiğine şaşırdım.
phunehehe

@phunehehe: Hangi 2 komut? Eğer demek istediğin ps -o tty= -p$pid, bu gösterileri süreci en kontrol terminal emülatörü tanımlayan hangi terminali (xterm, perde, sshd, ...) işlem içinde çalıştığını. Senin başka kabuğundan bir kabuk başlarsanız değişmez, ama eğer değişecek yeni bir terminal emülatörü başlatın. Terminal emülatörü yerel bir Mac uygulamasıysa, bilmediğim Mac'e özgü bir incelik olabilir.
Gilles 'SO- kötü olmaktan'

ps -o tty= -p$$ ve ps -o tty= -p$PPID çünkü farklı çıktılar üretmeleri gerektiğini söylediniz. Yoksa bir şeyi yanlış mı anladım?
phunehehe

@phunehehe: Kabuğun ana işlemi bir terminal emülatörü olduğunda, terminal emülatörünün kontrol terminali olarak öykünmüş terminaline sahip olmadığı zaman farklı çıktılar verir. Aksi halde bulursanız, lütfen çıktısını gönderin ps -p $$ -p $PPID(yine, OSX deneyimim yok, bu yüzden belki de OSX'te olağandışı bir şey olabilir).
Gilles 'SO- kötülük yapmayı bırak'

@Gilles: Bu gerçekten OSX ile alışılmadık bir şeydi. Gentoo'da test ettim ve dediğiniz gibi her şey doğruydu. OSX’te ps -p $$ -p $PPID(yorumlarınızı nasıl biçimlendireceğimi bilmediğim için üzgünüz) PID TTY TIME CMD 209 ttys000 0: 00.01 giriş - pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe

1

Çok şık değil, ancak kullanabilirsiniz ağaç görünümünü de Htop diğer koşu proccesses için kabuğundan ebeveyn-çocuk ilişkisini görmek için.

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

Ve "kök" kabuğuna girmeden önce, çıkmanız gereken mermi sayısını belirlemek için bunu kullanın.


1

SHLVL ortam değişkenini kullanabilirsiniz :

echo "$SHLVL"

1
Eğer kullanırsanız sshaynı hesaba örneğin bu hala olacak1
Anthon

0

Onu buldum

$ pstree -u | grep ${USER}

bir sistemde "nereye sığdığımı" görmek için oldukça yararlı olabilir. Ben tercih ederim pstree -u ${USER}.

Bazen bana nohupçalışan veya benzeri bir iş bıraktığımı hatırlatır .

(Ayrıca kullanıyorum alias grep='grep --color=auto'.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.