Bagaimana cara mengetahui "level" kerang saya?

32

Jika saya membuka terminal seperti xtermsaya akan memiliki shell. Kemudian jika saya menggunakan sshatau zshsaya akan memiliki "level" shell. Apakah ada cara untuk mengetahui berapa kali saya harus Ctrl+Datau mengetik exituntuk keluar dari semuanya? Niat saya yang sebenarnya adalah untuk keluar dari semuanya kecuali shell "root".

Akan menyenangkan mengetahui efek multiplexer terminal (seperti screen) pada solusi.

PS: Silakan mengubah judul, saya tidak tahu apakah itu istilah yang benar.

phhehehe
sumber

Jawaban:

6

Salah satu cara (diakui tidak sempurna) adalah dengan menambahkan hasil ps --no-headers -o comm $PPIDke prompt shell Anda. Ini akan memberi tahu Anda nama proses yang menelurkan shell Anda. Jika Anda berada di dalam zsh bersarang, ia akan mengatakan "zsh". Jika Anda berada di dalam zsh tingkat atas, ia akan membaca "xterm" atau "layar" atau apa pun yang dijalankan oleh shell Anda.

Untuk mengetahui apakah Anda berada di dalam sesi ssh atau su, Anda cukup melihat bagian nama host dan nama pengguna dari prompt Anda.

Ketika Anda menjalankan layar bersarang (yang saya tidak bayangkan adalah situasi umum), tidak ada cara saya bisa memikirkan untuk mengatakan apakah Anda berada di shell tingkat atas dari layar bersarang, atau shell tingkat atas dari layar tingkat atas. Anda bisa mengonfigurasi layar untuk selalu menampilkan garis status, yang akan menyebabkan banyak baris status ditampilkan, jika Anda berada di layar bersarang.

sepp2k
sumber
Aaah ... jepret .. kalahkan aku. :) +1
Stefan
Saat ini saya menggunakan mac dan perintah memberi saya ps: illegal option -- -, tahu mengapa? Saya akan mengujinya lagi di Linux segera :)
phunehehe
3
@ phunehehe: --option-namesebagian besar adalah fitur khusus GNU, jadi sebagian besar tidak tersedia dalam utilitas sistem standar di luar Linux. Tetapi Anda bisa mendapatkan efek ps --no-headersportable dengan menambahkan =setelah nama kolom. Juga commkolom tidak POSIX, tapi cmdkolom (yang meliputi argumen dari perintah) adalah. Juga -pdiperlukan sebelum PID dalam sintaks POSIX. Oleh karena ps -o cmd= -p $PPIDitu portabel dan memberikan informasi serupa.
Gilles 'SANGAT berhenti menjadi jahat'
dikonfirmasi, berfungsi di Gentoo
phunehehe
2
@ phunehehe: maaf, saya membuat kesalahan dalam komentar di atas. Sebenarnya commkolom tersebut ditentukan oleh POSIX dan didokumentasikan pada Mac OS X, sedangkan cmdkolom ada di Linux tetapi tidak standar.
Gilles 'SANGAT berhenti menjadi jahat'
37

Anda sebenarnya telah menemukan istilah yang benar¹. Ada variabel lingkungan SHLVLyang semua shells interaktif utama (bash, tcsh, zsh) bertambah 1 saat mereka mulai. Jadi, jika Anda memulai shell di dalam shell, SHLVLmeningkat 1.

Namun, ini tidak langsung menjawab kekhawatiran Anda, karena SHLVLmembahas hal-hal seperti emulator terminal. Misalnya, dalam konfigurasi tipikal saya, $SHLVLadalah 2 dalam xterm, karena level 1 sesuai dengan shell yang menjalankan sesi X saya ( ~/.xinitrcatau ~/.xsession).

Apa yang saya lakukan adalah untuk menampilkan $SHLVLprompt saya, tetapi hanya jika proses induk dari shell adalah shell lain (dengan heuristik seperti "jika namanya berakhir dengan shtanda baca dan digit opsional, ini adalah shell"). Dengan begitu, saya memiliki indikasi visual yang jelas dalam kasus yang tidak biasa dari shell yang berjalan di bawah shell lain.

Mungkin Anda lebih suka mendeteksi kerang yang berjalan langsung di bawah terminal emulator. Anda dapat melakukan ini cukup akurat: ini adalah kerang yang proses induk memiliki terminal pengontrol yang berbeda, sehingga ps -o tty= -p$$dan ps -o tty= -p$PPIDmenghasilkan output yang berbeda. Anda dapat mengatur ulang secara manual SHLVLke 1 di shell ini, atau mengatur Anda sendiri TERMSHLVLke 1 di shell ini (dan ditambahkan sebaliknya).

¹ Meskipun orang tidak akan berpikir itu melihat halaman manual: tidak satupun dari tiga shell yang mendukungnya termasuk kata "level" dalam dokumentasi mereka SHLVL.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih telah mengkonfirmasi istilah ini. Saya masih menggunakan mac dan terkejut menemukan 2 perintah itu memberikan hasil yang sama, terlepas dari tingkat shell saya.
phunehehe
@ phunehehe: apa 2 perintah? Jika maksud Anda ps -o tty= -p$pid, ini menunjukkan terminal pengontrol proses, yang mengidentifikasi emulator terminal (xterm, layar, sshd, ...) di mana proses berjalan. Proses ini tidak akan berubah jika Anda memulai shell dari shell lain, tetapi akan berubah jika Anda mulai emulator terminal baru. Jika emulator terminal adalah aplikasi Mac asli, mungkin ada kehalusan spesifik Mac yang tidak saya sadari.
Gilles 'SO- stop being evil'
ps -o tty= -p$$ dan ps -o tty= -p$PPID , karena Anda mengatakan mereka harus menghasilkan keluaran yang berbeda. Atau apakah saya salah mengerti sesuatu?
phunehehe
@ phunehehe: Mereka memberikan output yang berbeda ketika jika proses induk shell adalah emulator terminal, karena emulator terminal tidak memiliki terminal emulasi sebagai terminal pengendali. Jika Anda menemukan sebaliknya, silakan posting output ps -p $$ -p $PPID(sekali lagi, saya tidak punya pengalaman OSX, jadi mungkin ada sesuatu yang tidak biasa terjadi pada OSX).
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: itu memang sesuatu yang tidak biasa dengan OSX. Saya menguji di Gentoo dan semuanya benar seperti yang Anda katakan. Di OSX, ps -p $$ -p $PPIDberi (maaf saya tidak tahu bagaimana memformat komentar) PID TTY TIME CMD 209 ttys000 0: 00,01 login -pf phunehehe 210 ttys000 0: 00,12 -bash
phunehehe
1

Tidak terlalu elegan, tetapi Anda bisa menggunakan tampilan pohon di htop untuk melihat hubungan orangtua-anak dari shell Anda dengan proses yang berjalan lainnya.

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

Dan gunakan itu untuk menyimpulkan jumlah kerang yang Anda harus keluar, sebelum memulai pada "root" shell

Stefan
sumber
1

Anda dapat menggunakan variabel lingkungan SHLVL :

echo "$SHLVL"
Alex
sumber
1
Jika Anda menggunakan ssheg untuk akun yang sama ini masih1
Anthon
0

aku menemukan bahwa

$ pstree -u | grep ${USER}

bisa sangat membantu untuk melihat di mana saya "cocok" pada suatu sistem. Saya lebih suka itu pstree -u ${USER}.

Kadang-kadang itu akan mengingatkan saya bahwa saya meninggalkan nohuppekerjaan berjalan, atau serupa.

(Juga, saya gunakan alias grep='grep --color=auto'.)

J_H
sumber