जब मैंने आपका प्रश्न पढ़ा, तो मेरा पहला विचार था $SHLVL। तब मैंने देखा कि आप शेल स्तरों के अतिरिक्तvim स्तरों
को गिनना चाहते थे । ऐसा करने का एक सरल तरीका एक शेल फ़ंक्शन को परिभाषित करना है:
vim() { ( ((SHLVL++)); command vim "$@");}
SHLVL
हर बार जब आप एक vimकमांड टाइप करेंगे तो यह स्वतः और चुपचाप बढ़ेगा । आपको प्रत्येक संस्करण के लिए ऐसा करने की आवश्यकता होगी vi/ vimजिसे आप कभी भी उपयोग करते हैं; जैसे,
vi() { ( ((SHLVL++)); command vi "$@");}
view() { ( ((SHLVL++)); command view "$@");}
कोष्ठक का बाहरी सेट एक उप-प्रकार बनाता है, इसलिए मान के मैन्युअल परिवर्तन SHLVL
वर्तमान (मूल) शेल वातावरण को दूषित नहीं करता है। बेशक commandकीवर्ड वहाँ कार्यों को खुद को कॉल करने से रोकने के लिए है (जिसके परिणामस्वरूप अनंत पुनरावर्तन लूप होगा)। और निश्चित रूप से आपको इन परिभाषाओं को अपनी .bashrcया अन्य शेल आरंभीकरण फ़ाइल में रखना चाहिए ।
उपरोक्त में थोड़ी अक्षमता है। कुछ गोले में (एक होने के नाते), यदि आप कहते हैं
( cmd 1 ; cmd 2 ; … ; cmd n )
जहां एक बाहरी, निष्पादन योग्य कार्यक्रम (यानी, अंतर्निहित कमांड नहीं है), शेल एक अतिरिक्त प्रक्रिया को चारों ओर लेटा रहता है, बस समाप्त होने की प्रतीक्षा करने के लिए। यह (यकीनन) आवश्यक नहीं है; फायदे और नुकसान बहस योग्य हैं। यदि आपको थोड़ी सी मेमोरी और एक प्रक्रिया स्लॉट (और जब आप की आवश्यकता होती है , तो एक से अधिक शेल प्रक्रिया को देखने के लिए ) का मन नहीं करता है, तो उपरोक्त करें और अगले अनुभाग पर जाएं। यदि आप एक शेल का उपयोग कर रहे हैं तो डिट्टो जो अतिरिक्त प्रक्रिया को आसपास नहीं रखता है। लेकिन, अगर आप अतिरिक्त प्रक्रिया से बचना चाहते हैं, तो पहली कोशिश यह हैcmdncmdnps
vim() { ( ((SHLVL++)); exec vim "$@");}
execआदेश सुस्त से अतिरिक्त खोल प्रक्रिया को रोकने के लिए है।
लेकिन, एक गोत्र है। शेल की हैंडलिंग SHLVLकुछ सहज है: जब शेल शुरू होता है, तो यह जांचता है कि क्या SHLVLसेट है। यदि यह सेट नहीं है (या किसी संख्या के अलावा किसी अन्य चीज़ पर सेट है), तो शेल इसे 1 पर सेट करता है। यदि यह सेट है (एक नंबर पर), तो शेल इसमें 1 जोड़ता है।
लेकिन, इस तर्क से, यदि आप कहते हैं exec sh, तो आपको SHLVLऊपर जाना चाहिए। लेकिन यह अवांछनीय है, क्योंकि आपका वास्तविक शेल स्तर नहीं बढ़ा है।
जब आप ऐसा करते हैं तो शेल एक को घटाकर इसे संभालता है :SHLVLexec
$ echo "$SHLVL"
1
$ set | grep SHLVL
SHLVL=1
$ env | grep SHLVL
SHLVL=1
$ (env | grep SHLVL)
SHLVL=1
$ (env) | grep SHLVL
SHLVL=1
$ (exec env) | grep SHLVL
SHLVL=0
इसलिए
vim() { ( ((SHLVL++)); exec vim "$@");}
धोना है; इसे SHLVLफिर से बढ़ाने के लिए ही वेतन वृद्धि होती है । आप vimकिसी फ़ंक्शन के लाभ के बिना भी बस कह सकते हैं।
नोट:
स्टीफन चेज़लस (जो सब कुछ जानता है) के अनुसार , कुछ गोले काफी स्मार्ट होते हैं यदि ऐसा नहीं है तो execएक उपधारा में है।
इसे ठीक करने के लिए, आप करेंगे
vim() { ( ((SHLVL+=2)); exec vim "$@");}
फिर मैंने देखा कि आप गिनती करने के लिए चाहता था vimस्तरों
की स्वतंत्र रूप से खोल स्तरों। ठीक है, ठीक वही चाल काम करती है (ठीक है, एक मामूली संशोधन के साथ):
vim() { ( ((SHLVL++, VILVL++)); export VILVL; exec vim "$@");}
(और के लिए पर इसलिए vi, view, आदि) exportआवश्यक है क्योंकि VILVLडिफ़ॉल्ट रूप से एक वातावरण चर के रूप में परिभाषित नहीं है। लेकिन इसे समारोह का हिस्सा बनने की आवश्यकता नहीं है; आप बस export VILVLएक अलग कमांड के रूप में कह सकते हैं (अपने में .bashrc)। और, जैसा कि ऊपर चर्चा की गई है, यदि अतिरिक्त शेल प्रक्रिया आपके लिए कोई समस्या नहीं है, तो आप इसके command vimबजाय कर सकते हैं exec vim, और SHLVLअकेले छोड़ सकते हैं:
vim() { ( ((VILVL++)); command vim "$@");}
व्यक्तिगत पसंद:
आप VILVLकुछ का नाम बदलना चाह सकते हैं VIM_LEVEL। जब मैं " VILVL" देखता हूं, तो मेरी आंखें दुखती हैं; वे यह नहीं बता सकते हैं कि यह "विनाइल" की गलत वर्तनी है या एक विकृत रोमन अंक है।
यदि आप ऐसे शेल का उपयोग कर रहे हैं जो समर्थन नहीं करता है SHLVL(उदाहरण के लिए, डैश), तो आप इसे तब तक स्वयं कार्यान्वित कर सकते हैं जब तक शेल किसी स्टार्टअप फ़ाइल को लागू करता है। जैसे कुछ करो
if [ "$SHELL_LEVEL" = "" ]
then
SHELL_LEVEL=1
else
SHELL_LEVEL=$(expr "$SHELL_LEVEL" + 1)
fi
export SHELL_LEVEL
आपकी .profileया लागू फ़ाइल में। (आपको शायद नाम का उपयोग नहीं करना चाहिए SHLVL, क्योंकि यह अराजकता का कारण होगा यदि आप कभी भी शेल का उपयोग करना शुरू करते हैं जो समर्थन करता है SHLVL।)
अन्य उत्तरों ने आपके शेल प्रॉम्प्ट में पर्यावरण चर मान (ओं) को एम्बेड करने के मुद्दे को संबोधित किया है, इसलिए मैं इसे नहीं दोहराऊंगा, विशेष रूप से आप कहते हैं कि आप पहले से ही जानते हैं कि यह कैसे करना है।
$SHLVLचर (कई गोले द्वारा बनाए रखा गया है) आप क्या देख रहे हैं?