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:
User@Wsl:~$ pstree
init─┬─init───bash───pstree
└─{init}
User@Wsl:~$ bash
User@Wsl:~$ sh
$ bash
User@Wsl:~$ pstree
init─┬─init───bash───bash───sh───bash───pstree
└─{init}
Dalam lingkungan Linux / Ubuntu yang sebenarnya pohon proses akan lebih rumit. Kami dapat memfilter pohon dengan opsi -syang akan menunjukkan kepada orang tua dari proses yang dipilih. Jadi perintah kami adalah pstree -s $$, di mana $$variabel lingkungan yang berisi PID saat ini:
User@Ubuntu:~$ pstree -s $$
systemd──lightdm──lightdm──upstart──gnome-terminal-──bash──pstree
User@Ubuntu:~$ bash
User@Ubuntu:~$ sh
$ bash
User@Ubuntu:~$ pstree -s $$
systemd──lightdm──lightdm──upstart──gnome-terminal-──bash──bash──sh──bash──pstree
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:
DEPTH=$(($(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>') - 1))
if (( DEPTH > 1 )); then PS1=$DEPTH:$PS1; fi
cshdan tcsh> .cshrc:
@ DEPTH = `pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'` - 0
if ( $DEPTH > 1 ) then; set prompt="$DEPTH":"$prompt"; endif
zsh> .zshrc:
DEPTH=$(($(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>') - 1))
if (( DEPTH > 1 )); then PROMPT=$DEPTH:$PROMPT; fi
ksh> .kshrc:
DEPTH=$(($(pstree -s $$ | sed -r 's/\-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>') - 0))
if (( DEPTH > 1 )); then PS1="$DEPTH":"$PS1"'$ '; fi
shitu sebenarnya dashdi Ubuntu - di sini masalahnya sedikit rumit dan kabel (baca referensi di bawah untuk informasi lebih lanjut):
Edit ~/.profilefile dan tambahkan baris berikut di bagian bawah:
ENV=$HOME/.shrc; export ENV
Buat file ~/.shrcdengan konten berikut, perhatikan kshjuga membaca $ENV:
#!/bin/dash
DEPTH=$(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>')
if [ "$0" != 'ksh' ]; then DEPTH=$((DEPTH - 1)); fi
if [ "$DEPTH" -gt 1 ]; then export PS1='$DEPTH:\$ '; fi
Referensi:
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
sudo touch /usr/local/bin/depth
sudo chmod +x /usr/local/bin/depth
Edit file dengan editor favorit Anda dan tambahkan baris berikut sebagai kontennya:
#!/bin/bash
SHELLS='(bash|zsh|sh|dash|ksh|csh|tcsh)'
DEPTH=$(pstree -s $$ | sed -r 's/-+/\n/g' | grep -Ec "\<$SHELLS\>")
if [[ $@ =~ -v ]]
then
pstree -s $$ | sed -r 's/-+/\n/g' | grep -E "\<$SHELLS\>" | cat -n
fi
echo "DEPTH: $DEPTH"
[[ $DEPTH -gt 1 ]] && exit 0 || exit 1
Script di atas memiliki dua opsi -vatau --verboseyang akan menampilkan daftar shell yang terlibat. Dan opsi lain yang akan memeriksa apakah kedalamannya lebih besar dari satu dan berdasarkan ini akan kembali exit 0atau exit 1, sehingga Anda dapat menggunakannya dengan cara ini depth && exit. Berikut adalah beberapa contoh penggunaan:
User@Ubuntu:~$ depth # we are at the 1st level - bash
DEPTH: 1
User@Ubuntu:~$ sh
$ csh # we are at the 2nd level - dash
Ubuntu:~% depth # we are at the 3rd level - csh
DEPTH: 3
Ubuntu:~% ksh
$ depth -v # we are at the 4th level - ksh
1 bash
2 sh
3 csh
4 ksh
DEPTH: 4
$ depth && exit # exit to the 3rd level - csh
DEPTH: 4
Ubuntu:~% depth && exit # exit to the 2nd level - dash
DEPTH: 3
exit
$ depth && exit # exit to the 1st level - bash
DEPTH: 2
User@Ubuntu:~$ depth && exit # stay at the 1st level - bash
DEPTH: 1
User@Ubuntu:~$ depth && exit # stay at the 1st level - bash
DEPTH: 1
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 suatau sudo -iterlibat:
User@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh|su|sudo)\>'
1
User@Ubuntu:~$ echo $SHLVL
1
User@Ubuntu:~$ depth
DEPTH: 1
User@Ubuntu:~$ su spas
Password:
Spas@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh|su|sudo)\>'
1
Spas@Ubuntu:~$ echo $SHLVL
2
Spas@Ubuntu:~$ depth
DEPTH: 2
Spas@Ubuntu:~$ sudo -i
[sudo] password for spas:
Root@Ubuntu:~# ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh|su|sudo)\>'
3
Root@Ubuntu:~# echo $SHLVL
1
Root@Ubuntu:~# depth
DEPTH: 3
Ketika ada proses latar belakang diluncurkan:
User@Ubuntu:~$ bash
User@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'
2
User@Ubuntu:~$ echo $SHLVL
2
User@Ubuntu:~$ depth
DEPTH: 2
User@Ubuntu:~$ while true; do sleep 10; done &
[1] 10886
User@Ubuntu:~$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'
3
User@Ubuntu:~$ echo $SHLVL
2
User@Ubuntu:~$ depth
DEPTH: 2
# Note: $SHLVL is not supported only by sh/dash.
# It works with all other tested shells: bash, zsh, csh, tcsh, ksh
User@Ubuntu:~$ sh
$ ps | grep -Ec '\<(bash|zsh|sh|dash|ksh|csh|tcsh)\>'
4
$ echo $SHLVL
2
$ depth
DEPTH: 3