मैं कैसे जांचूं कि मैं किस शेल का उपयोग कर रहा हूं?

मैंने पढ़ा कि टर्मिनल शेल के अलावा और कुछ नहीं है, और यूनिक्स गोले के विभिन्न स्वाद प्रदान करता है:

  • बॉर्न शेल (एसएच)
  • सी शैल (सीएसएच)
  • टीसी शैल (टीसीएसएच)
  • कॉर्न शेल (केएसएच)
  • बॉर्न अगेन शेल (बैश)

प्रश्न:

  • जब मैं एक टर्मिनल विंडो खोलता हूं, तो डिफ़ॉल्ट रूप से कौन सा शेल खोला जाता है?
  • मैं कैसे जांचूं कि कितने गोले स्थापित हैं?
  • मैं अपने खाते से उपयोग किए गए शेल को कैसे बदलूं?

आप अपने टर्मिनल में निम्न कमांड टाइप करके देख सकते हैं कि आप किस शेल का उपयोग कर रहे हैं:

echo $0

यदि आप उपयोग कर रहे हैं तो परिणाम नीचे के समान कुछ दिखाई देगा बैश (बॉर्न फिर शैल) टर्मिनल:

-bash

डिफ़ॉल्ट वातावरण पर आपके पास मौजूद शेल को खोजने के लिए आप मान की जांच कर सकते हैं SHELL पर्यावरण चर:

echo $SHELL

वर्तमान शेल इंस्टेंस को खोजने के लिए, वर्तमान शेल इंस्टेंस के पीआईडी वाले प्रक्रिया (शेल) को देखें ।

शेल के वर्तमान उदाहरण के पीआईडी को खोजने के लिए:

echo "$$"

अब पीआईडी होने की प्रक्रिया को खोजने के लिए:

ps -p <PID>

इसे एक साथ रखना:

ps -p "$$"

$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

इसके बजाय एसएच के आह्वान में $$ सिंटैक्स का उपयोग करें, लेकिन फिर हम पीपीआईडी की तलाश कर रहे हैं न कि पीआईडी की । सीएमडी खोजने के लिए पीपीआईडी का उपयोग करें ।

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

सुधार के लिए धन्यवाद @मुरू

यह जानने के लिए कि आपके उपयोगकर्ता के लिए डिफ़ॉल्ट शेल कौन सा है, आप चला सकते हैं:

echo "$SHELL"

उदाहरण के लिए यदि आप बैश का उपयोग कर रहे हैं तो आपको निम्न आउटपुट मिलना चाहिए:

/bin/bash

यदि आपने कोई कॉन्फ़िगरेशन नहीं बदला है तो इसे बैश होना चाहिए क्योंकि यह उबंटू पर डिफ़ॉल्ट शेल है ।

मूल पोस्ट ने तीन प्रश्न पूछे। दिए गए उत्तर पहले प्रश्न को कवर करते हैं, "जब मैं एक टर्मिनल विंडो खोलता हूं, तो डिफ़ॉल्ट रूप से कौन सा शेल खोला जाता है?"वे एक प्रश्न का उत्तर भी देते हैं जो नहीं पूछा गया था, अर्थात् "मैं कैसे पता लगा सकता हूं कि वर्तमान में टर्मिनल में कौन सा शेल चल रहा है?"हालांकि, जहां तक मैं देख सकता हूं कि किसी ने भी मूल रूप से पूछे गए दूसरे या तीसरे प्रश्नों का उत्तर नहीं दिया है, अर्थात् "मैं कैसे जांच करूं कि कितने गोले स्थापित हैं?"और" मैं अपने खाते से उपयोग किए गए शेल को कैसे बदलूं?"

  • जवाब देने के लिए " मैं कैसे जांचूं कि कितने गोले स्थापित हैं?"निम्न आदेश सभी उपलब्ध गोले को सूचीबद्ध करेगा:

    cat /etc/shells

    उदाहरण के लिए, उबंटू 18.10 की डिफ़ॉल्ट स्थापना पर यह देता है:

    # /etc/shells: valid login shells/bin/sh/bin/dash /bin/bash/bin/rbash

    हालांकि, डिफ़ॉल्ट रूप से एसएच डैश के लिए एक प्रतीकात्मक लिंक है, जबकि आरबैश विकल्प-आर ("प्रतिबंधित बैश") के साथ बैश से लिंक करता है, इसलिए वास्तव में केवल दो गोले हैं, चार नहीं जैसा कि उपरोक्त सूची से पता चलता है । निम्न आदेश आपको दिखाएगा कि क्या सूचीबद्ध गोले में से कोई भी वास्तव में प्रतीकात्मक लिंक है, और यदि ऐसा है तो वे कहां से लिंक करते हैं: एलएस-एल / बिन

  • अब प्रश्न के लिए " मैं अपने खाते से उपयोग किए गए शेल को कैसे बदलूं?"यह मानते हुए कि" मैं डिफ़ॉल्ट शेल को स्थायी रूप से कैसे बदलूं जो एक टर्मिनल का उपयोग करेगा", एक उत्तर है यहाँ.

अपने तीसरे प्रश्न को संबोधित करने के लिए, &उद्धरण;मैं अपने खाते से उपयोग किए गए शेल को कैसे बदलूं?उत्तर का उपयोग करना है chsh.

दो मोड हैं:

  • इंटरएक्टिव, और;
  • गैर-इंटरैक्टिव।

से गोले बदलना - अपना लॉगिन शेल बदलना जो स्थायी है, और इसे थोड़ा सा पैराफ्रेश करना:

आप नामक एक कार्यक्रम का उपयोग करेंगे सीएचएसएच. एक इंटरैक्टिव विधि हैऔर गैर-इंटरैक्टिव विधि। अपने टर्मिनल में निम्नलिखित टाइप करें:

इंटरएक्टिव विधि

$ chsh

इसके परिणामस्वरूप एक संक्षिप्त संवाद होता है जिसमें उपयोगकर्ता को पहले संकेत दिया जाता हैउनका पासवर्ड और फिर वांछित नए शेल के पूर्ण पथ के लिए ।

किसी के डिफ़ॉल्ट शेल को बदलते समय सावधानी बरती जानी चाहिए क्योंकिएक त्रुटि करना संभव है कि केवल रूट उपयोगकर्ता (यानी, सिस्टमएडमिनिस्ट्रेटर) मरम्मत कर सकता है (हालांकि एक कुशल उपयोगकर्ता के लिए इसे होम सिस्टम पर सुधारना आसान होना चाहिए) । विशेष रूप से, वर्तमान सत्र में अस्थायी रूप से शेल का परीक्षण करना महत्वपूर्ण है और फिर यह सुनिश्चित करना है कि स्थायी परिवर्तन करते समय एक वैध शेल नाम दर्ज किया जा रहा है ।

गैर-इंटरैक्टिव विधि

मैं फिर से एक उदाहरण के रूप में सीएसएच का उपयोग करूंगा ।

$ chsh -s /bin/csh

-s संपादक में जाने के बिना इसे आपके लिए सेट करता है ।

एक बार जब यह सफलतापूर्वक निष्पादित हो जाता है, तो echo $SHELL अभी भी कहेगाकि आप पहले की तरह ही खोल में हैं । हालाँकि, आपको लॉग आउट करने की आवश्यकता हैऔर परिवर्तन प्रभावी होने के लिए वापस । अब करते हैं echo $SHELL. आप देखना चाहिए कि यह नया खोल दिखाता है ।

मेरे द्वारा कनेक्ट किए गए सर्वरों में से एक में, लॉगिन शेल है /bin/sh जो एक सिमलिंक है /bin/bash

यहां अधिकांश उत्तर देंगे sh, जो ओपी को बॉर्न शेल पर विचार करेगा और जीएनयू बैश को छोड़कर नहीं यह एक कि देता है /bin/bash

एक अन्य विकल्प जो इस मामले के लिए काम करता है वह है:

$ echo $SHELL/bin/sh$ ls -l /bin/shlrwxrwxrwx 1 root root 4 May 31 16:15 /bin/sh -> bash$ /bin/sh --helpGNU bash, version 4.2.10(1)Usage:  /bin/sh [GNU long option] [option] ...        /bin/sh [GNU long option] [option] script-file ...

आप शायद जानना नहीं चाहेंगे वर्तमान शेल का नाम (उदा. -bash, bash, zsh, आदि । , से echo $0), न ही डिफ़ॉल्ट शेल का निष्पादन योग्य पथ (से echo $SHELL), बल्कि वर्तमान शेल का निष्पादन योग्य पथ (विशेष रूप से उपयोगी उदाहरण के लिए यदि आपके पास बैश के एक से अधिक संस्करण स्थापित हैं) ।

इसके लिए आप उपयोग कर सकते हैं lsof -p "$$" या केवल आवश्यक जानकारी निकालने के लिए कुछ अतिरिक्त कोडिंग के साथ:

lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n 1

होमब्रे के माध्यम से स्थापित बैश के लिए उदाहरण आउटपुट:

/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 बजाय.

वर्तमान शेल का निर्धारण कैसे करें जिस पर मैं काम कर रहा हूं? पर stackoverflow.com

@ कसिया यह भी संबंधित है command line - What is default shell for terminal? - Ask Ubuntu

कृपया ध्यान दें कि टर्मिनल शेल के लिए इंटरफ़ेस है (जो एक बिंदु पर वास्तव में भौतिक इंटरफ़ेस हुआ करता था), और शेल टर्मिनल नहीं है - यह एक कमांड दुभाषिया है । यह भी देखें command line - How do I check which terminal I am using? - Ask Ubuntu