$SHELL आपको डिफ़ॉल्ट शेल देता है । $0 आपको वर्तमान खोल देता है ।
उदाहरण के लिए: मेरे पास मेरे डिफ़ॉल्ट शेल के रूप में बैश है, जिसका उपयोग मैं अपने टर्मिनल ऐप के लिए करता हूं । लेकिन मेरे आईटर्म 2 ऐप के लिए, मैं कमांड का उपयोग करता हूं क्योंकि विंडो खुलती है: /bin/ksh.
तो मेरे $0 मुझे देता है /bin/ksh आईटर्म 2 पर । $SHELL मुझे देता है /bin/bash आईटर्म 2 पर । $0,$SHELL मुझे देता है /bin/bash टर्मिनल पर
अन्य उत्तर शेल विशिष्ट विशेषताओं का उपयोग करते हैं, लेकिन हम यह पता लगाने की कोशिश कर रहे हैं कि हम किस शेल का उपयोग कर रहे हैं, इसलिए वे समस्या का उत्तर मान लेते हैं । उदाहरण के लिए कोई भी उत्तर मछली पर काम नहीं करेगा ।
sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p
इसके बजाय एसएच के आह्वान में $$ सिंटैक्स का उपयोग करें, लेकिन फिर हम पीपीआईडी की तलाश कर रहे हैं न कि पीआईडी की । सीएमडी खोजने के लिए पीपीआईडी का उपयोग करें ।
मूल पोस्ट ने तीन प्रश्न पूछे। दिए गए उत्तर पहले प्रश्न को कवर करते हैं, "जब मैं एक टर्मिनल विंडो खोलता हूं, तो डिफ़ॉल्ट रूप से कौन सा शेल खोला जाता है?"वे एक प्रश्न का उत्तर भी देते हैं जो नहीं पूछा गया था, अर्थात् "मैं कैसे पता लगा सकता हूं कि वर्तमान में टर्मिनल में कौन सा शेल चल रहा है?"हालांकि, जहां तक मैं देख सकता हूं कि किसी ने भी मूल रूप से पूछे गए दूसरे या तीसरे प्रश्नों का उत्तर नहीं दिया है, अर्थात् "मैं कैसे जांच करूं कि कितने गोले स्थापित हैं?"और" मैं अपने खाते से उपयोग किए गए शेल को कैसे बदलूं?"
जवाब देने के लिए " मैं कैसे जांचूं कि कितने गोले स्थापित हैं?"निम्न आदेश सभी उपलब्ध गोले को सूचीबद्ध करेगा:
cat /etc/shells
उदाहरण के लिए, उबंटू 18.10 की डिफ़ॉल्ट स्थापना पर यह देता है:
हालांकि, डिफ़ॉल्ट रूप से एसएच डैश के लिए एक प्रतीकात्मक लिंक है, जबकि आरबैश विकल्प-आर ("प्रतिबंधित बैश") के साथ बैश से लिंक करता है, इसलिए वास्तव में केवल दो गोले हैं, चार नहीं जैसा कि उपरोक्त सूची से पता चलता है । निम्न आदेश आपको दिखाएगा कि क्या सूचीबद्ध गोले में से कोई भी वास्तव में प्रतीकात्मक लिंक है, और यदि ऐसा है तो वे कहां से लिंक करते हैं: एलएस-एल / बिन
अब प्रश्न के लिए " मैं अपने खाते से उपयोग किए गए शेल को कैसे बदलूं?"यह मानते हुए कि" मैं डिफ़ॉल्ट शेल को स्थायी रूप से कैसे बदलूं जो एक टर्मिनल का उपयोग करेगा", एक उत्तर है यहाँ.
आप नामक एक कार्यक्रम का उपयोग करेंगे सीएचएसएच. एक इंटरैक्टिव विधि हैऔर गैर-इंटरैक्टिव विधि। अपने टर्मिनल में निम्नलिखित टाइप करें:
इंटरएक्टिव विधि
$ chsh
इसके परिणामस्वरूप एक संक्षिप्त संवाद होता है जिसमें उपयोगकर्ता को पहले संकेत दिया जाता हैउनका पासवर्ड और फिर वांछित नए शेल के पूर्ण पथ के लिए ।
किसी के डिफ़ॉल्ट शेल को बदलते समय सावधानी बरती जानी चाहिए क्योंकिएक त्रुटि करना संभव है कि केवल रूट उपयोगकर्ता (यानी, सिस्टमएडमिनिस्ट्रेटर) मरम्मत कर सकता है (हालांकि एक कुशल उपयोगकर्ता के लिए इसे होम सिस्टम पर सुधारना आसान होना चाहिए) । विशेष रूप से, वर्तमान सत्र में अस्थायी रूप से शेल का परीक्षण करना महत्वपूर्ण है और फिर यह सुनिश्चित करना है कि स्थायी परिवर्तन करते समय एक वैध शेल नाम दर्ज किया जा रहा है ।
गैर-इंटरैक्टिव विधि
मैं फिर से एक उदाहरण के रूप में सीएसएच का उपयोग करूंगा ।
$ chsh -s /bin/csh
द -s संपादक में जाने के बिना इसे आपके लिए सेट करता है ।
एक बार जब यह सफलतापूर्वक निष्पादित हो जाता है, तो echo $SHELL अभी भी कहेगाकि आप पहले की तरह ही खोल में हैं । हालाँकि, आपको लॉग आउट करने की आवश्यकता हैऔर परिवर्तन प्रभावी होने के लिए वापस । अब करते हैं echo $SHELL. आप देखना चाहिए कि यह नया खोल दिखाता है ।
आप शायद जानना नहीं चाहेंगे वर्तमान शेल का नाम (उदा. -bash, bash, zsh, आदि । , से echo $0), न ही डिफ़ॉल्ट शेल का निष्पादन योग्य पथ (से echo $SHELL), बल्कि वर्तमान शेल का निष्पादन योग्य पथ (विशेष रूप से उपयोगी उदाहरण के लिए यदि आपके पास बैश के एक से अधिक संस्करण स्थापित हैं) ।
इसके लिए आप उपयोग कर सकते हैं lsof -p "$$" या केवल आवश्यक जानकारी निकालने के लिए कुछ अतिरिक्त कोडिंग के साथ:
होमब्रे के माध्यम से स्थापित बैश के लिए उदाहरण आउटपुट:
/usr/local/Cellar/bash/5.1.8/bin/bash
या जेडएसएच के लिए:
/bin/zsh
उपरोक्त से अलग है echo $SHELL, दोनों क्योंकि उपरोक्त शेल के लिए है जो वर्तमान में उपयोगकर्ता के डिफ़ॉल्ट शेल के बजाय चल रहा है, और इसलिए भी कि उपरोक्त किसी भी सिम्लिंक के विस्तार के बाद निष्पादन योग्य देता है । उदाहरण के लिए एक ही बैश के लिए ऊपर के रूप में स्थापित करें, echo $SHELL देता है /usr/local/bin/bash.
संपादित करें: यदि आपको शेल के पथ में संभावित स्थान वर्णों की अनुमति देने की आवश्यकता है, तो उपयोग करें lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n +9 | xargs बजाय.