हमारे पास लॉगिन, गैर-लॉगिन, इंटरैक्टिव और गैर-इंटरएक्टिव बैश शेल क्यों हैं?


23

तो बैश मैन पेज बताते हैं कि लॉगिन और इंटरेक्टिव शेल क्या हैं:

एक लॉगिन शेल वह है जिसका तर्क शून्य का पहला वर्ण a - है, या एक - thelogin विकल्प के साथ शुरू हुआ है।

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

मुझे लगता है कि इसका मतलब है कि हमारे पास 4 अलग-अलग प्रकार के गोले हो सकते हैं:

  • इंटरएक्टिव लॉगिन गोले,
  • गैर-संवादात्मक लॉगिन गोले,
  • इंटरएक्टिव गैर-लॉगिन गोले,
  • गैर-संवादात्मक गैर-लॉगिन गोले

लेकिन हमारे पास पहली जगह में इंटरैक्टिव / गैर-इंटरैक्टिव और लॉगिन / गैर-लॉगिन गोले क्यों हैं? विविधता क्यों? यदि हमारे पास केवल एक प्रकार का शेल होता तो हम क्या खोते?

यह भी निर्धारित करने की कोशिश कर रहा है कि क्या मैं रनिंग द्वारा लॉगिन शेल में हूं echo $-, यह आउटपुट:

himBH

इन चिह्नों में से कुछ को समझाया गया है यहाँ , लेकिन h, Hहै, और mसमझाया नहीं कर रहे हैं। क्या कोई जगह है जो इन सभी झंडों का वर्णन करती है?

जवाबों:


21

ये गोले के विभिन्न "प्रकार" पर मेरे विचार हैं - दुर्भाग्य से मैंने शुरुआत से ही Un * x का उदय नहीं देखा था (मुझे लगता है कि यह अवधारणा ऐतिहासिक रूप से एक अच्छे विस्तार के लिए उगाई गई है), इसलिए कृपया महत्वपूर्ण रहें।

  • जब मैं एक सिस्टम में लॉग करता हूं (आजकल ग्राफिकल एक्स लॉगिन के माध्यम से), तो कुछ कार्य हो सकते हैं जो एक बार चलना चाहिए, उदाहरण के लिए किसी प्रकार के सर्वर से कनेक्शन स्थापित करें, मुझे आज की टूडू सूची प्रस्तुत करें, कुछ कमांड आदि। हर बार जब मैं एक नया टर्मिनल खोलता हूं तो मुझे खुशी नहीं होनी चाहिए। तो वहाँ config फ़ाइलों का एक सेट है ( /etc/profile, ~/.bash_loginऔर इतने पर, एक सटीक सूची के लिए मैनुअल को देखें) द्वारा केवल sourced लॉगिन गोले।
  • तदनुसार, कनेक्शन बंद करने के लिए, कुछ प्रोग्राम्स को मारें, एक बैकअप स्क्रिप्ट चलाएं ~/.bash_logoutजब लॉगिन शेल मौजूद हो।
  • इसलिए, "सामान्य" शेल जो मैं एक टर्मिनल में उपयोग करता हूं, एक लॉगिन शेल को बा नहीं करना चाहिए , लेकिन फिर भी मेरी व्यक्तिगत प्राथमिकताओं को पढ़ना चाहिए ~/.bashrc, क्योंकि मैं चाहता हूं कि मेरी कीबाइंडिंग शेल के साथ बातचीत करें - इसलिए यह एक इंटरैक्टिव, गैर- है लॉगिन शेल।
  • और अंतिम, लेकिन कम से कम जब बैश का उपयोग स्क्रिप्टिंग के लिए किया जाता है, तो न तो यह महत्वपूर्ण है। bashजितनी जल्दी हो सके शुरू करना चाहिए, अर्थात किसी भी विन्यास फाइल को नहीं पढ़ना चाहिए। यह एक गैर-इंटरैक्टिव, गैर-लॉगिन शेल है

तो, आपके प्रश्न का मेरा उत्तर क्या होगा यदि हम केवल एक प्रकार का शेल खो देते हैं? एक शब्द में है: "लचीलापन।"


आपके दूसरे प्रश्न का उत्तर आसान है:

$-विकल्पों के वर्तमान सेट को सूचीबद्ध करता है। ये या तो कमांड लाइन मापदंडों द्वारा bashया setबिलिन के माध्यम से सेट किया जा सकता है । इसलिए आपको मैनुअल में दो स्थानों को देखना होगा:

  • OPTIONS अनुभाग:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSअनुभाग, उपधारा set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.

1
वू, मेरा मानना ​​है कि ओपी के स्पष्ट रूप से तैयार किए गए प्रश्न के लिए @mpy उत्तर कुछ उपयोगी परिभाषाओं के अनुकूल है। उसके बारे में: तो, एक गैर-लॉगिन शेल सिर्फ लॉगिन शेल का एक उपसमूह है?
tuk0z
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.