Terkadang saya melakukan hal-hal seperti memulai sub-shell dari vim with :sh
. Bagaimana saya tahu jika saya berada di sub-shell di mana exit
hanya akan mengembalikan saya satu tingkat, vs berada di shell terluar di mana exit
akan mengeluarkan saya atau menutup sesi saya.
Apakah ada semacam totem Inception yang dapat saya putar atau sesuatu untuk mengetahui berapa level saya?
command-line
Wyck
sumber
sumber
echo $0
. Jika itu adalah shell tingkat atas, itu mungkin akan dimulai dengan tanda hubung. (Ini berlaku setidaknya untuk bash, dan tanda hubung berarti itu disebut shell login.)Jawaban:
Anda dapat menggunakan perintah
pstree
(yang datang secara default dengan Ubuntu). Berikut ini contohnya - saat ini saya hanya memiliki satu jendela terminal terbuka di WSL:Dalam lingkungan Linux / Ubuntu yang sebenarnya pohon proses akan lebih rumit. Kami dapat memfilter pohon dengan opsi
-s
yang akan menunjukkan kepada orang tua dari proses yang dipilih. Jadi perintah kami adalahpstree -s $$
, di mana$$
variabel lingkungan yang berisi PID saat ini:Referensi:
Tambahkan indikator ke prompt shell: Berdasarkan ide @ waltinator , untuk memiliki penghitung di depan prompt untuk beberapa shell yang berbeda ketika levelnya lebih dalam dari satu, saya telah menambahkan garis, ditunjukkan di bawah demo, di bagian bawah file perintah jalankan yang relevan (
~/.*rc
).Saya telah membuat tes pada WSL, Ubuntu 16.04, Ubuntu 18.04 (server / desktop), Ubuntu 19.04, dalam sesi gnome-terminal, tty dan ssh. Inilah cara kerjanya:
Batasannya adalah: penghitung hanya berfungsi untuk tingkat kedalaman 13-14, tergantung pada OS. Saya tidak bermaksud menyelidiki alasannya :)
bash
>.bashrc
:csh
dantcsh
>.cshrc
:zsh
>.zshrc
:ksh
>.kshrc
:sh
itu sebenarnyadash
di Ubuntu - di sini masalahnya sedikit rumit dan kabel (baca referensi di bawah untuk informasi lebih lanjut):Edit
~/.profile
file dan tambahkan baris berikut di bagian bawah:Buat file
~/.shrc
dengan konten berikut, perhatikanksh
juga membaca$ENV
:Referensi:
.profile
dan.kshrc
Buat perintah yang akan menampilkan kedalaman: Opsi lain adalah membuat perintah shell yang akan menampilkan kedalaman. Untuk tujuan ini, buat file yang dapat dieksekusi (dengan demikian harus dapat diakses oleh seluruh sistem):
/usr/local/bin/depth
Edit file dengan editor favorit Anda dan tambahkan baris berikut sebagai kontennya:
Script di atas memiliki dua opsi
-v
atau--verbose
yang akan menampilkan daftar shell yang terlibat. Dan opsi lain yang akan memeriksa apakah kedalamannya lebih besar dari satu dan berdasarkan ini akan kembaliexit 0
atauexit 1
, sehingga Anda dapat menggunakannya dengan cara inidepth && exit
. Berikut adalah beberapa contoh penggunaan:Perbandingan dengan solusi lain: Saya menghabiskan beberapa waktu tambahan untuk mencari tahu beberapa kelemahan dari pendekatan yang diberikan di sini. Saya dapat membayangkan dua kasus berikut (huruf kapital diperlukan untuk penyorotan sintaksis yang lebih baik):
Kapan
su
atausudo -i
terlibat:Ketika ada proses latar belakang diluncurkan:
sumber
systemd───xfce4-terminal───bash───pstree
. Kenapa begini?xfce4-terminal
, yang meluncurkanbash
shell, di mana Anda berlaripstree
, yang melaporkan dirinya dan orang tuanya. Jika yang Anda maksud adalah kurangnya langkah-langkah antara systemd dan xfce4-terminal, bisa jadi apa pun yang diluncurkan xfce4-terminal mati atau tidak diakui, dalam hal ini akan diwarisi oleh init.SHLVL
? Portabilitas di seluruh proses dan sistem, saya berasumsi, tapi pstree mungkin tidak diinstal ..$SHLVL
tidak didukung oleh beberapa kerang. Lebih spesifik, menurut lingkungan dari demo di atas tidak hanya didukung olehsh
(dash
) - dan shell ini tidak dihitung sama sekali oleh variabel ini. Di sisi lainpstree
adalah bagian dari paket psmisc yang menyediakan jugafuser
,killall
dan beberapa lainnya - ini adalah komponen utama Ubuntu - saya belum menginstalnya pada sistem yang disebutkan dalam jawaban ini.Periksa nilai
SHLVL
variabel shell:Mengutip dari
bash
halaman buku panduan:Ini juga didukung oleh
zsh
.sumber
:sh
default ke shell login pengguna saya pikir (itu benar-benar bentuk disingkat:shell
daripada nama biner shell tertentu):sh
darivim
sebelum memposting jawaban ini, dan itu meningkatkan level shell untuk saya. Shell login saya adalah bash.Di saya
.bashrc
, saya gunakan$SHLVL
untuk menyesuaikan$PS1
, dengan menambahkan+
tanda " " ke$SUBSHELL
variabel saya :Lalu, saya bisa melihat seberapa dalam diri saya:
sumber
awk:
pgrep:
Anda dapat menempatkan salah satu dari dua versi dalam file dan menggunakan sumber untuk membuat $ DEPTH tersedia.
sumber
Anda cukup menggunakan
ps
tanpa argumen tambahan untuk melihat seluruh tumpukan shell (termasuk yang sekarang). Ini juga akan menunjukkan semua pekerjaan latar belakang yang telah Anda mulai sertaps
dirinya sendiri, tetapi itu dapat memberi Anda perkiraan kasar seberapa dalam Anda.sumber
{ echo hello world; ps; } &
untuk membuktikanps
jawaban di atas.