आप कमांड का उपयोग कर सकते हैं pstree(जो कि Ubuntu के साथ डिफ़ॉल्ट रूप से आता है)। यहाँ उदाहरण है - वर्तमान में मैं 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}
एक वास्तविक लिनक्स / उबंटू वातावरण में प्रक्रिया पेड़ अधिक जटिल होगा। हम पेड़ को उस विकल्प द्वारा फ़िल्टर कर सकते हैं -sजो एक चयनित प्रक्रिया के माता-पिता को दिखाएगा। तो हमारा कमांड हो सकता है pstree -s $$, जहां $$एक पर्यावरण चर है जिसमें वर्तमान पीआईडी शामिल है:
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
संदर्भ:
शेल के प्रॉम्प्ट में संकेतक जोड़ें: @ वाल्टिनेटर के विचार के आधार पर , कई अलग-अलग शेल के लिए प्रॉम्प्ट के सामने एक काउंटर होने पर जब स्तर एक से अधिक गहरा होता है, मैंने लाइनों को जोड़ा है, जो डेमो के नीचे दिखाया गया है, प्रासंगिक रन कमांड ( ~/.*rc) फ़ाइलों के नीचे।
मैंने WSL, Ubuntu 16.04, Ubuntu 18.04 (सर्वर / डेस्कटॉप), Ubuntu 19.04 पर सूक्ति-टर्मिनल, tty और ssh सत्र के भीतर परीक्षण किए हैं। यहाँ है कि यह कैसे काम करता है:

सीमा यह है कि: काउंटर केवल ओएस के आधार पर गहराई के 13-14 स्तरों के लिए काम करता है। मैं कारणों की जांच करने का इरादा नहीं है :)
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
cshऔर 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
shयह वास्तव dashमें उबंटू पर है - यहां चीजें थोड़ी जटिल हैं और वायर्ड हैं (अधिक जानकारी के लिए नीचे दिए गए संदर्भ पढ़ें):
~/.profileफ़ाइल को संपादित करें और नीचे दी गई पंक्ति जोड़ें:
ENV=$HOME/.shrc; export ENV
~/.shrcनिम्नलिखित सामग्री के साथ फ़ाइल बनाएँ , नोट kshयह भी पढ़ता है $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
संदर्भ:
एक कमांड बनाएं जो गहराई को आउटपुट करेगा: एक अन्य विकल्प शेल कमांड बनाना है जो गहराई को आउटपुट करेगा। इस प्रयोजन के लिए निष्पादन योग्य फ़ाइल बनाएं (इस प्रकार यह सुलभ प्रणाली चौड़ी होनी चाहिए):/usr/local/bin/depth
sudo touch /usr/local/bin/depth
sudo chmod +x /usr/local/bin/depth
फ़ाइल को अपने पसंदीदा संपादक के साथ संपादित करें और उसकी सामग्री के रूप में निम्न पंक्तियाँ जोड़ें:
#!/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
उपरोक्त स्क्रिप्ट में दो विकल्प हैं -vया --verboseयह शामिल गोले की सूची का उत्पादन करेगा। और दूसरा विकल्प जो यह जांच करेगा कि क्या गहराई एक से अधिक है और इसके आधार पर यह वापस आएगा exit 0या exit 1, इसलिए आप इसे इस तरह से उपयोग कर सकते हैं depth && exit। यहां उपयोग के कुछ उदाहरण दिए गए हैं:
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
अन्य समाधानों की तुलना: मैंने यहां दिए गए दृष्टिकोणों की कुछ कमजोरियों का पता लगाने के लिए कुछ अतिरिक्त समय बिताया। मैं निम्नलिखित दो मामलों की कल्पना करने में सक्षम था (बेहतर सिंटैक्स हाइलाइटिंग के लिए बड़े अक्षरों की आवश्यकता है):
कब suया sudo -iशामिल हैं:
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
जब एक पृष्ठभूमि प्रक्रिया शुरू होती है:
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