डिफ़ॉल्ट रूप से OSX लॉगिन गोले पर इंटरैक्टिव गोले क्यों हैं?


43

लिनक्स और, मेरे ज्ञान में, सभी यूनिक्स सिस्टम, टर्मिनल एमुलेटर डिफ़ॉल्ट रूप से इंटरैक्टिव, गैर-लॉगिन गोले चलाते हैं। इसका मतलब यह है कि, बैश के लिए, शुरू किया गया शेल होगा:

जब एक इंटरेक्टिव शेल जो कि एक लॉगिन शेल नहीं है, शुरू होता है, तो bash पढ़ता है और कमांड से निष्पादित करता है /etc/bash.bashrcऔर ~/.bashrc, यदि ये फाइलें मौजूद हैं। --norc विकल्प का उपयोग करके इसे बाधित किया जा सकता है ।

--rcfile फ़ाइल विकल्प पढ़ सकते हैं और के बजाय फ़ाइल से आदेश पर अमल करने के लिए पार्टी के लिए बाध्य करेगा /etc/bash.bashrcऔर ~/.bashrc

और लॉगिन गोले के लिए:

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में या --loginविकल्प के साथ एक गैर-इंटरैक्टिव शेल के रूप में लागू किया जाता है , तो यह पहले फ़ाइल से कमांड को पढ़ता है और निष्पादित करता है /etc/profile, यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में , और , के लिए लग रहा है ~/.bash_profile, ~/.bash_loginऔर ~/.profileपहले से मौजूद आदेशों को पढ़ता है और निष्पादित करता है और पढ़ने योग्य है।

--noprofileविकल्प इस्तेमाल किया जा सकता है जब खोल इस व्यवहार को बाधित करने के लिए शुरू कर दिया है।

OSX पर, डिफ़ॉल्ट शेल (जो कि bash है) को डिफ़ॉल्ट टर्मिनल (Terminal.app) में वास्तव में स्रोत ~/.bash_profileया ~.profileआदि में शुरू किया गया है । दूसरे शब्दों में, यह लॉगिन शेल की तरह कार्य करता है।

मुख्य प्रश्न : डिफ़ॉल्ट इंटरेक्टिव शेल OSX पर एक लॉगिन शेल क्यों है? OSX ने ऐसा करने का विकल्प क्यों चुना? इसका मतलब यह है कि शेल आधारित चीजों के लिए सभी निर्देश / ट्यूटोरियल जो बदलती चीजों का उल्लेख करते ~/.bashrcहैं, ओएसएक्स या इसके विपरीत में विफल हो जाएंगे ~/.profile। फिर भी, जबकि Apple पर कई आरोप लगाए जा सकते हैं, अक्षम या मूर्खतापूर्ण देवों को काम पर रखना उनमें से एक नहीं है। संभवतः, उनके पास इसके लिए एक अच्छा कारण था, इसलिए क्यों?

प्रश्न: क्या Terminal.app वास्तव में एक इंटरैक्टिव लॉगिन शेल चलाता है या उन्होंने बैश के व्यवहार को बदल दिया है? क्या यह Terminal.app के लिए विशिष्ट है या क्या यह टर्मिनल एमुलेटर से स्वतंत्र है?


2
Terminal.app एक लॉगिन शेल चलाता है। मुझे नहीं पता कि Apple ने ऐसा क्यों चुना।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


33

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

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

जैसा कि एलन श्टको द्वारा लिंक किए गए डेबियन विकी पेज बताते हैं:

" .bashrcएक अलग फ़ाइल क्यों है .bash_profile, तब? यह ज्यादातर ऐतिहासिक कारणों से किया जाता है, जब आज के वर्कस्टेशंस की तुलना में मशीनें बेहद धीमी थीं। कमांडों को संसाधित करना .profileया इसमें .bash_profileकाफी लंबा समय लग सकता है, खासकर एक ऐसी मशीन पर जहां बहुत सारा काम हो। बाहरी आदेशों (प्री-बैश) द्वारा किया जाना था। इसलिए कठिन प्रारंभिक सेट-अप कमांड, जो पर्यावरण चर बनाते हैं जो कि बाल प्रक्रियाओं को पारित किया जा सकता है, को अंदर डाला जाता है .bash_profile। क्षणिक सेटिंग्स और उपनाम जो विरासत में नहीं मिलते हैं, उन्हें डाल दिया जाता है। में .bashrcइतना है कि वे हो सकता है कि हर subshell द्वारा फिर से पढ़ें। "

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


अब, अन्य प्रकार के गोले द्वारा साझा नहीं किए जाने वाले बैश की एक मूर्खतापूर्ण ख़ासियत यह है कि .bashrcयदि यह लॉगिन शेल के रूप में शुरू किया गया है तो यह स्वचालित रूप से नहीं चलेगा । इसके लिए मानक कार्य-आस-पास निम्नलिखित कमांड जैसी कुछ चीज़ों को शामिल करना है .bash_profile:

[[ -e ~/.profile ]] && source ~/.profile    # load generic profile settings
[[ -e ~/.bashrc  ]] && source ~/.bashrc     # load aliases etc.

वैकल्पिक रूप से, यह .bash_profileबिल्कुल नहीं होना संभव है , और यदि आवश्यक हो तो .profileचलाने के लिए जेनेरिक फ़ाइल में कुछ बैश-विशिष्ट कोड शामिल करें .bashrc

यदि OSX डिफ़ॉल्ट है .bash_profileया .profile ऐसा नहीं करता है , तो यह यकीनन एक बग है। किसी भी स्थिति में, उचित कार्य-चारों ओर बस उन पंक्तियों को जोड़ना है .bash_profile


संपादित करें: आवारा नोटों के रूप में, OSX पर डिफ़ॉल्ट शेल tcsh हुआ करता था, जिसका व्यवहार इस संबंध में बहुत ही स्पष्ट है: जब एक इंटरेक्टिव लॉगिन शेल के रूप में चलाया जाता है, तो tcsh स्वचालित रूप से .profile और .tcshrc / दोनों को पढ़ता है .cshrc, और इस तरह .bash_profileट्रिक जैसे किसी भी वर्कआउट की आवश्यकता नहीं होती है ऊपर दिखाए गए।

इसके आधार पर, मुझे 99% यकीन है कि OSX की विफलता एक उपयुक्त डिफ़ॉल्ट की आपूर्ति करने में विफलता .bash_profileहै, क्योंकि जब वे टीसीएस से bash तक स्विच करते हैं, तो Apple के लोग बस इस छोटे मस्सा को bash के स्टार्टअप व्यवहार में नोटिस नहीं करते हैं। Tsh के साथ, ऐसी किसी ट्रिक की जरूरत नहीं थी - OSX टर्मिनल एमुलेटर जस्ट प्लेन वर्क्स से लॉगिन शेल के रूप में tcsh शुरू करना और इस तरह के कलुगों के बिना सही काम करना।


1
धन्यवाद, मुझे लगता है कि सब पता था। मेरा सवाल यह है कि.bashrc अप्रासंगिक रेंडर करने के लिए OSX को इस तरह से सेट करने का विकल्प क्यों चुना गया ? उन्होंने सभी गोले लॉगिन गोले बनाने का विकल्प क्यों चुना? जहाँ तक मैं बता सकता हूँ, केवल आपका अंतिम वाक्य ही संबोधित करता है और केवल यह कहना है कि यह एक बग है।
terdon

1
नहीं, मुद्दा यह है कि वे अपने टर्मिनल एमुलेटर में लॉगिन गोले शुरू करते हैं। डॉटफ़ाइल्स डिफ़ॉल्ट बैश व्यवहार हैं, लॉगिन गोले शुरू करना प्रोफ़ाइल आदि को पढ़ेगा, न कि bashrc आदि। सवाल यह है कि लॉगिन लॉग गैर-लॉग वाले लोगों के बजाय क्यों चलाए जाते हैं।
terdon

2
हां, और मैंने और एलन दोनों ने समझाया है कि यह इसलिए है क्योंकि लिनक्स के विपरीत, OSX .profileजब उपयोगकर्ता GUI में लॉग इन करता है, तब निष्पादित नहीं होता है , इसलिए उन्हें पर्यावरण चर जैसे $PATH, जो सामान्य रूप .profileसे सही तरीके से सेट किए गए हैं, प्राप्त करने के लिए इसे बाद में निष्पादित करना होगा। । तथ्य यह है कि, साइड इफेक्ट के रूप में, इसका कारण खट्टा .bashrcन होना एक बग है; आप इस बारे में बहस कर सकते हैं कि क्या यह बग या ओएसएक्स में बग है, लेकिन यह इस तथ्य को नहीं बदलता है कि सही व्यवहार यह सुनिश्चित करने के लिए होगा कि पर्यावरण चर .profileऔर बैश विन्यास दोनों से .bashrcलोड हो रहे हैं।
इल्मरी करोनें

1
.bashrcस्रोत होने .profileसे एक बुरा विचार होगा, क्योंकि यह हर उपधारा को फिर से चलाने का कारण होगा .profile। यदि और कुछ नहीं है, तो यह सामान्य .profileमुहावरों का कारण होगा जैसे export PATH = "$HOME/bin:$PATH"अनावश्यक प्रवेश को रोकना $PATH.profileस्रोत होने से .bashrcबहुत अधिक समझ में आता है, लेकिन केवल यह जाँचने के बाद कि यह चल रहा है, वास्तव में बैश है। .bash_profileदोनों के स्रोत होने .profile और .bashrc , जैसा कि मैंने ऊपर सुझाव दिया है, IMO, सबसे समझदार विकल्प है।
इल्मरी करोनें

2
और मैं "क्यों वे एक लॉगिन शेल का उपयोग करते हैं?" "क्योंकि उन्हें लोड करने की आवश्यकता है .profile", जबकि उत्तर "क्यों वे स्रोत .bashrcसे नहीं करते हैं .profile, तब?" है "क्योंकि यह एक बग है!" गंभीरता से, यह संभवतः एक जानबूझकर निर्णय नहीं हो सकता है; यह सिर्फ कुछ वे अनदेखी की है, शायद इसलिए, मैक पारिस्थितिकी तंत्र में, गोले द्वितीय श्रेणी के नागरिक हैं जो अधिकांश उपयोगकर्ताओं से निपटने के लिए नहीं हैं। (Ps। एक ऐतिहासिक विवरण के लिए स्ट्रगल के उत्तर को भी देखें ; यह निश्चित रूप से
tc

14

मुख्य कारण यह है कि एक्स टर्मिनल एप्लिकेशन डिफ़ॉल्ट रूप से गैर-लॉगिन गोले चलाते हैं, समय की शुरुआत में, आपके .Xsession ने आपके प्रारंभिक लॉगिन आइटम सेट करने के लिए .profile चलाया होगा। फिर, चूंकि यह सब पहले से ही सेट अप था, इसलिए टर्मिनल ऐप्स को इसे चलाने की आवश्यकता नहीं थी, वे .bashrc चला सकते थे। इस बात की चर्चा https://wiki.debian.org/DotFiles पर क्यों है :

एक उदाहरण के रूप में xdm लेते हैं। पियरे एक दिन छुट्टी से वापस आता है और पता चलता है कि उसके सिस्टम प्रशासक ने डेबियन सिस्टम पर एक्सडीएम स्थापित किया है। वह बस ठीक से लॉग इन करता है, और xdm उसकी .xsession फाइल पढ़ता है और फ्लक्सबॉक्स चलाता है। सब कुछ ठीक लगता है जब तक कि उसे गलत लोकेल में कोई त्रुटि संदेश न मिले! चूँकि वह अपने .bash_profile में LANG चर को ओवरराइड करता है, और चूंकि xdm कभी नहीं पढ़ता है। bash_profile, उसका LANG चर अब fr_CA के बजाय en_US पर सेट है।

अब, इस समस्या का भोला समाधान यह है कि "xterm" लॉन्च करने के बजाय, वह "xterm -ls" लॉन्च करने के लिए अपने विंडो मैनेजर को कॉन्फ़िगर कर सकता है। यह ध्वज xterm को बताता है कि एक सामान्य शेल लॉन्च करने के बजाय, उसे एक लॉगिन शेल लॉन्च करना चाहिए। इस सेटअप के तहत, xterm स्पैन / बिन / बैश करता है, लेकिन यह तर्क वेक्टर में "- / बिन / बैश" (या शायद "-बैश") डालता है, इसलिए बैश एक लॉगिन शेल की तरह कार्य करता है। इसका मतलब है कि हर बार जब वह एक नया xterm खोलता है, तो वह / etc / प्रोफाइल और .bash_profile (अंतर्निहित बैश व्यवहार) पढ़ेगा और फिर .bashrc (क्योंकि .bash_profile ऐसा करने के लिए कहता है)। यह पहली बार में ठीक काम करने के लिए लग सकता है - उसकी डॉट फाइलें भारी नहीं हैं, इसलिए वह देरी की सूचना भी नहीं देता है - लेकिन एक अधिक सूक्ष्म समस्या है। उन्होंने अपने फ्लक्सबॉक्स मेनू से सीधे एक वेब ब्राउज़र भी लॉन्च किया, और वेब ब्राउज़र को फ्लक्सबॉक्स से LANG वेरिएबल विरासत में मिला है, जो अब गलत लोकेल पर सेट है। तो जबकि उसका xterms ठीक हो सकता है, और उसके xterms से लॉन्च किया गया कुछ भी ठीक हो सकता है, उसका वेब ब्राउज़र अभी भी उसे गलत लोकेल में पेज दे रहा है।

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

क्या .bashrc के बारे में, फिर? क्या यह बेकार है? यह अभी भी उद्देश्य है कि यह VT100 के दिनों में था। यह किसी भी समय के लिए उपयोग किया जाता है जब आप एक टर्मिनल विंडो खोलने के अलावा एक शेल खोलते हैं। इसलिए यदि आप Emacs या vi से बाहर हैं, या यदि आप एक su उपयोगकर्ता करते हैं।


1
जिस डेबियन पेज को आप उद्धृत कर रहे हैं, वह बताता है कि क्यों डेबियन के .profileस्रोत हैं .bashrc, न कि ओएसएक्स ने डिफ़ॉल्ट रूप से सभी गोले लॉगिन गोले बनाने का फैसला क्यों किया। दरअसल, आप मेरा एक और सवाल का जवाब दे रहे हैं , और धन्यवाद! हालाँकि, आपका जवाब OSX पसंद की व्याख्या नहीं करता है और डेबियन बोली पूरी तरह से यहाँ अप्रासंगिक है जहाँ तक मैं बता सकता हूँ (कृपया मुझे बताएं कि क्या मैं बस याद कर रहा हूँ)। OSX रास्ता .bashrcआदि को बेकार बना देता है और इससे .profileअधिक उपयोगी नहीं होता है।
terdon

4

मुझे नहीं पता कि उन्होंने ऐसा क्यों किया होगा। हालाँकि, यहाँ मेरा अनुमान है।

शुरू करने के लिए, यह ध्यान देने योग्य है कि GNU / Linux सिस्टम पर, आप निश्चित रूप से vt1, vt2, आदि पर स्विच कर सकते हैं। आपको वहां एक लॉगिन शेल मिलता है। OS X सिस्टम पर, कोई समकक्ष नहीं है। UNIX अंडरपिनिंग तक पहुंचने का एकमात्र तरीका एक टर्मिनल एमुलेटर या एकल उपयोगकर्ता मोड के माध्यम से है (अस्वीकरण: मैंने वास्तव में कभी एकल उपयोगकर्ता मोड का उपयोग नहीं किया है; यह कमांडलाइन-संचालित IIRC है, लेकिन मैं गलत हो सकता हूं)। इसलिए, ओएस एक्स में जो कुछ भी डिफ़ॉल्ट एमुलेटर में है वह पूरे सिस्टम के लिए डिफ़ॉल्ट है।

अब, आप डिफ़ॉल्ट को एक लॉगिन शेल क्यों बनाएंगे? एक युगल हैं (पढ़ें: कई नहीं) कारण मैं ऐसा करने के लिए सोच सकता हूं।

  • यदि आप बॉक्स में SSH करते हैं तो यह एक सुसंगत उपयोगकर्ता अनुभव प्रदान करता है। (ओएस एक्स के सर्वर संस्करण के लिए विशेष रूप से महत्वपूर्ण - यदि आप एक ओएस एक्स सर्वर चला रहे हैं, तो संभवतः आप एक नौसिखिया हैं।)
  • OS X का डिफ़ॉल्ट शेल हुआ करता था tcsh। यह लगभग एक अनुमान के रूप में जंगली है जैसा कि आप प्राप्त कर सकते हैं, लेकिन यह हो सकता है कि tcshसामान्य रूप से लॉगिन शेल के रूप में चलने पर कुछ किया जाए, और ऐतिहासिक पैटर्न अटक गया। (मुझे संदेह है, हालांकि - शायद पुराने नियमित लोगों में से एक हमें बता सकता है।)
  • "हम Apple हैं। हम ग्रह पर सबसे बड़े यूनिक्स वितरण के विक्रेता हैं। यह हमारे कारणों को कितना तुच्छ है, इससे कोई फर्क नहीं पड़ता; यदि हम कोई निर्णय लेते हैं, तो आपके उपकरण को इससे निपटना होगा।"

ईमानदारी से, मैं ~ 6 वर्षों से डार्विन का उपयोग कर रहा हूं और मैं इस प्रश्न का ठीक से उत्तर नहीं दे सकता। यह वास्तव में मेरे लिए कोई मतलब नहीं है, या तो।

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


1
Tcsh का उल्लेख करने के लिए +1, चूँकि इसके व्यवहार में बैश की तुलना में इस संबंध में बहुत कम है: जब एक इंटरैक्टिव लॉगिन शेल के रूप में शुरू किया गया था, तो टीसीएस दोनों स्रोतों .profileऔर .tcshrc/ .cshrcजैसे कि मेरे जवाब में दिए गए किसी भी kluges की आवश्यकता के बिना। यह देखते हुए, मुझे संदेह है कि यह व्यवहार tcsh से bash के स्विच के कारण एक अनफ्रीग्रेटेड रिग्रेशन है।
इल्मरी करोनें

@IlmariKaronen क्या आप (यहाँ और वहाँ ) का मतलब है कि tcsh के स्रोत .loginऔर .tcshrc/ .cshrc? यह स्रोत के लिए टीसीएस के लिए कोई मतलब नहीं होगा .profile; इसमें आमतौर पर shसिंटैक्स के साथ कमांड होते हैं जो tcshस्वीकार नहीं करेंगे। मेरे पास macOS नहीं है, लेकिन मैंने /bin/tcshअपना लॉगिन खोल Ubuntu 16.04 पर बनाया है । .profileखट्टा नहीं है। tcsh (1) उस फ़ाइल का उल्लेख नहीं करता है, न ही यह tcsh (1) करता है
एलियाह कगन

3

यह वर्तमान स्थिति के लिए एक अद्यतन है: उत्तर बासी हो गए हैं क्योंकि नए MacOSX संस्करण जारी किए गए हैं और लॉगिन व्यवहार बदल गया है।

यह सवाल 2014 में पूछा गया था और इसका जवाब दिया गया था। मैं अलग-अलग लिनक्स डिस्ट्रोस और बीएसडी के उपयोग के लिए एक सामान्य .bashrc &bash_profile सेट के निर्माण के प्रयास में विषय पर शोध कर रहा हूं (जो भी उन्हें डिस्ट्रोस नहीं हैं तो वे कहते हैं)।

मैंने हाल ही में सिएरा स्थापित के साथ एक इस्तेमाल किया मैक मिनी खरीदा है, इसलिए मेरे पास अब 10.6, 10.10, 10.11, और 10.12 के साथ सिस्टम हैं। हालांकि मैंने पुराने लोगों को छोड़ दिया है (उनकी पिछली स्थिति का सुराग छोड़ते हुए), 10.12 सिएरा इंस्टालेशन अछूता है।

परिणाम: 10.12 सिएरा में, कोई डिफ़ॉल्ट .bashrc, .bash_profile, या .profile बनाया गया है। / Etc में, bashrc, bashrc_Apple_Terminal और प्रोफ़ाइल हैं। / Etc / प्रोफ़ाइल की सामग्री:

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

/ Etc / bashrc की सामग्री:

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

/ Etc / bashrc_Apple_Terminal स्क्रिप्ट PROMPT_COMMAND चर सेट करता है और प्रत्येक टर्मिनल के लिए सत्र स्थिति को संरक्षित करने के लिए एक तंत्र स्थापित करता है; यदि टर्मिनल ऐप को छोड़ दिया जाता है, तो ऐप को फिर से शुरू करने पर पिछले सत्र की स्थिति बहाल हो जाती है। अन्यथा, लगभग कुछ भी नहीं (न्यूनतम $ PS1) / etc / bashrc में सेट किया गया है, किसी भी अन्य अनुकूलन (वास्तविक $ PS1, उपनाम, फ़ंक्शन) को ~ / .bashrc और $ PATH सेटिंग्स में .bash_bile (या। Inprofile) पर सेट करने के लिए छोड़ दिया जाता है। , .bash_profile द्वारा में निहित)।

मैंने पुष्टि की है कि iTerm2 टर्मिनल ऐप के समान व्यवहार करता है, सिवाय इसके कि लॉगिन सत्र शुरू करने का डिफ़ॉल्ट व्यवहार दिखाई देता है और इसे संपादित किया जा सकता है।

यदि आप X11 (अब XQuartz) XTerm टर्मिनल सत्र चलाते हैं, तो आपको एक गैर-लॉगिन सत्र दिखाई देगा, जो कि लिनक्स सिस्टम पर होता है; .bash_profile (या .profile) छोड़ दिया जाता है, और आपको बस .bashrc मिलता है।

और, यहाँ मेरा जवाब है:

हालांकि टर्मिनल ऐप एक एक्सटर्म (TERM = xterm-256color) होने का दावा करता है, लेकिन यह तब तक $ DISPLAY वैरिएबल सेट नहीं करता जब तक X11 इंस्टॉल नहीं हो जाता। हम एक एक्स वातावरण का अनुकरण देख रहे हैं, लेकिन पूरी तरह से वास्तविक नहीं है। यदि आप -X स्विच (X11 अग्रेषण सक्षम करें) के साथ एक और सिस्टम में SSH करते हैं, तो यह विफल हो जाएगा क्योंकि $ DISPLAY चर नहीं है। यदि आपने X11 स्थापित किया है, तो SSH एक अन्य प्रणाली में, X11 अग्रेषण सफल होगा।

निचला रेखा (और संक्षिप्त उत्तर): टर्मिनल ऐप एक सही X11 टर्मिनल नहीं है ($ DISPLAY सेट नहीं करता है); यह XTerm सत्र की तुलना में SSH लॉगिन की तरह अधिक व्यवहार करता है, इसमें / etc / प्रोफ़ाइल और ~ / .bash_profile या ~ / .profile से मान सेट करने के लिए एक लॉगिन सत्र होना चाहिए।


0

ऊपर दिए गए उत्तरों ने इसका कारण बताया कि इंटरैक्टिव गोले डिफ़ॉल्ट रूप से macOS पर लॉगिन गोले क्यों हैं: सेटिंग्स में /etc/profile, ~/.profileX- आधारित सिस्टम पर एक गैर-लॉगिन शेल द्वारा विरासत में मिला है, लेकिन macOS पर नहीं । यहाँ मैं आपको याद दिलाना चाहता हूँ कि आपको हमेशा macOS पर लॉगिन शेल का उपयोग करना चाहिए क्योंकि इसका अस्तित्व है path_helper:

 cat /etc/profile # or cat /etc/zprofile
# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

path_helperउपयोगिता निर्देशिका में फ़ाइलों की सामग्री को पढ़ता है /etc/paths.dऔर /etc/manpaths.d और करने के लिए अपनी सामग्री जोड़ देती है PATHऔर MANPATHक्रमश: वातावरण चर। ( MANPATHपर्यावरण-परिवर्तन चर को तब तक संशोधित नहीं किया जाएगा, जब तक कि यह पर्यावरण में पहले से ही निर्धारित न हो।)

यदि आप एक गैर-लॉगिन शेल का उपयोग कर रहे हैं, तो कुछ पथ आयात नहीं किए जाएंगे।

मुझे लगता है कि डेवलपर के लिए /etc/paths.dअपने पथ मूल्यों को आयात करने के लिए फ़ाइल डालना हमेशा एक अच्छा विचार है , लेकिन कॉल करने योग्य बायनेरिज़ को इस तरह से /usr/binया उसके जैसे स्थानों पर सिमिलिंक करने के लिए नहीं /bin। (डिफ़ॉल्ट PATHहै /usr/bin:/bin:/usr/sbin:/sbin। हर कोई कस्टम मानों को जोड़ने में Homebrew या MacPorts का उपयोग नहीं करता है PATH। इसलिए कॉल करने योग्य आदेशों के सिमिलिंक लगाने के लिए हमेशा एक सुरक्षित स्थान नहीं होता है।)

यहाँ फ़ाइलों का एक उदाहरण है /etc/paths.d। मूल रूप से आप प्रत्येक पंक्ति में एक मान डाल रहे हैं।

 cat /etc/paths.d/Wireshark
/Applications/Wireshark.app/Contents/MacOS

संदर्भ:

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