क्यों 'गूंज $ 0' दो अलग-अलग टर्मिनलों के लिए अलग-अलग परिणाम देता है?


15

मैं का उपयोग कर Ubuntu पर एक टर्मिनल खोला Ctrl+ Alt+ Tऔर एक निर्देशिका करने के लिए राइट क्लिक जा रहा है और फिर और "टर्मिनल में खोलें" का चयन करके एक अलग टर्मिनल।

मैंने echo $0दोनों मामलों में किया।

पहले मामले में:

$ echo $0
-bash

दूसरे मामले में:

$ echo $0
/bin/bash

यह अंतर क्यों?


$ 0 चल रही प्रक्रिया का नाम देता है।
रमेश

क्या आप अलग-अलग उपयोगकर्ता के साथ दो टर्मिनल चलाते हैं?
16

मैं उसी उपयोगकर्ता का उपयोग करता हूं
CodeBlue

3
इसी तरह के प्रश्न पूछें ।ububuntu.com
अविनाश राज

क्या वे वास्तव में अलग-अलग टर्मिनल एमुलेटर या एक ही टर्मिनल एमुलेटर के सिर्फ दो उदाहरण हैं? क्या वे दोनों डिफ़ॉल्ट टर्मिनल हैं?
terdon

जवाबों:


16

यदि echo $0कमांड का आउटपुट है, -bashतो इसका मतलब है कि bashलॉगिन शेल के रूप में लागू किया गया था। यदि आउटपुट केवल है bash, तो आप एक गैर-लॉगिन शेल में हैं।

man bash 126 रेखा पर कहीं कहता है:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

यहाँ और अधिक देखें: लॉगिन शेल और नॉन-लॉगिन शेल के बीच अंतर?

अब, यह समझाने के लिए कि आपको /bin/bashदूसरे मामले में क्यों मिला , मैं कह सकता हूं कि एक प्रोग्राम (आपके मामले में आपका फ़ाइल मैनेजर, शायद नॉटिलस) या कोई स्क्रिप्ट अपने आप $0को कुछ और में बदल सकती है। उदाहरण के तौर पर देखें कि $0मेरे टर्मिनल (हर समय एक ही टर्मिनल) में क्या हो रहा है :

यहाँ छवि विवरण दर्ज करें


12

अंतर नीचे है जिस तरह से ये शुरू किए गए थे। बैश अलग से शुरू होगा (अलग-अलग स्टार्टअप स्क्रिप्ट पढ़ें) यह आरजीवी [0] पर निर्भर करता है। यदि स्ट्रिंग एक हाइफ़न के साथ शुरू होती -है -bashतो यह एक लॉगिन शेल के रूप में चलता है, यदि नहीं, तो यह एक इंटरैक्टिव शेल के रूप में चलेगा। यह एक गैर-संवादात्मक शेल (यानी एक शेल स्क्रिप्ट में) के रूप में भी चल सकता है।

अधिक जानने के लिए, मैनुअल, man bashइनवोकेशन अनुभाग को पढ़ना सबसे अच्छा है ।


9

जब आप लॉगिन करते हैं तो एक शेल शुरू किया जाता है, लेकिन यह प्रोग्राम की तरह भी शुरू होता है make, या जब आप शेल स्क्रिप्ट चलाते हैं, या जब आप टाइप :shकरते हैं vi, या जब आप एक नई टर्मिनल विंडो बनाते हैं।

मूल रूप से, ~/.profileजब आप लॉग इन या रन करते हैं तो शेल पढ़ा जाता है su। यह स्क्रिप्ट यह घोषणा करने जैसी चीजें करेगी कि क्या आपके पास नया ईमेल था, अपने मिटाए गए पात्रों को अनुकूलित करें और TERM और PATH चर को सेट और निर्यात करें। जब लगभग किसी अन्य संदर्भ में शुरू किया गया था, तो शेल पढ़ा नहीं गया था ~/.profile, क्योंकि उन चीजों में से अधिकांश करना बेमानी होगा। आपसे नए शेल के लिए किसी भी महत्वपूर्ण शेल चर का निर्यात करने की अपेक्षा की गई थी।

जिस तरह से शेल को पता था कि क्या पढ़ना है ~/.profileया नहीं, यह देखने के लिए कि क्या argv[0]उर्फ का पहला चरित्र $0था '-'

के साथ शुरू csh, उपनाम पेश किए गए थे। उपनाम पर्यावरण में निर्यात नहीं किए गए थे। cshको दो अलग-अलग इनिशियलाइज़ेशन स्क्रिप्ट में पढ़ने के लिए डिज़ाइन किया गया था। ~/.loginकेवल तभी पढ़ा जाता है जब कोई उपयोगकर्ता लॉग इन करता है, और ऐसा करने के लिए क्यू अगर इसके argv[0]साथ शुरू किया गया था '-'~/.cshrcहर बार खोलना शुरू किया गया था। सामान्य तौर पर, एक ने एलियास को ~/.cshrcऔर बाकी सभी चीजों को अंदर रखा ~/.logincshयह भी समर्थित है ~/.logout, जो ज्यादातर मामलों में स्क्रीन को साफ किया और भाग गया fortune

अन्य गोले ने भी यही विशेषताएं अपनाईं। kshमें पढ़ता था ~/.kshrc, में bashपढ़ता था ~/.bashrcऔर वे थे जहाँ आप अपनी अन्य परिभाषाएँ रखेंगे ।

इसलिए, एक लंबी कहानी को छोटा करने के लिए, एक शेल को जन्म देने वाले एप्लिकेशन को यह तय करने के लिए मिलता है कि क्या यह "लॉगिन शेल" होना चाहिए, जिस स्थिति '-'में शुरुआत में या एक नियमित शेल है। ज्यादातर मामलों में, एक शेल जो इंटरएक्टिव होने वाला है, उसे एक लॉगिन शेल के रूप में शुरू किया जाता है, और एक शेल का मतलब सिर्फ कुछ कमांड चलाने के लिए होता है, या तो तर्क के रूप में या स्क्रिप्ट से, और फिर बाहर निकलना एक नियमित शेल होता है।

लेकिन यह शेल शुरू होने वाले एप्लिकेशन के पूरे होने तक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.