আপনি কমান্ডটি ব্যবহার করতে পারেন 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