আপনি কমান্ডটি ব্যবহার করতে পারেন pstree(এটি উবুন্টু সহ ডিফল্টরূপে আসে)। উদাহরণস্বরূপ - বর্তমানে আমার ডাব্লুএসএলে একটিমাত্র খোলা টার্মিনাল উইন্ডো রয়েছে:
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) ফাইলগুলির নীচে।
আমি ডাব্লুএসএল, উবুন্টু 16.04, উবুন্টু 18.04 (সার্ভার / ডেস্কটপ), উবুন্টু 19.04, জিনোম-টার্মিনাল, টিটি এবং এসএস সেশনের মধ্যে পরীক্ষা দিয়েছি। এখানে এটি কীভাবে কাজ করে:

সীমাবদ্ধতাটি হ'ল: ওএসের উপর নির্ভর করে কাউন্টারটি কেবল 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