सवाल .Bashrc और .bash_profile के बीच अंतर


के बीच क्या अंतर है .bashrc तथा .bash_profile और मुझे किस का उपयोग करना चाहिए?


409
2017-09-02 14:40


मूल


इस तरह के एक ही सवाल को भी देखें ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile - Stefan Lasiewski
यदि आप एक और पूर्ण स्पष्टीकरण चाहते हैं जिसमें भी शामिल है .profile, इस सवाल पर एक नज़र डालें: superuser.com/questions/789448/... - Flimm
इस जवाब में कुछ पहलुओं को भी शामिल किया गया है stackoverflow.com/questions/415403/... - Sergey Voronezhskiy


जवाब:


पारंपरिक रूप से, जब आप यूनिक्स सिस्टम में लॉग इन करते हैं, तो सिस्टम आपके लिए एक प्रोग्राम शुरू करेगा। वह कार्यक्रम एक खोल है, यानी, एक कार्यक्रम जो अन्य कार्यक्रम शुरू करने के लिए डिज़ाइन किया गया है। यह एक कमांड लाइन खोल है: आप अपना नाम टाइप करके एक और प्रोग्राम शुरू करते हैं। डिफ़ॉल्ट खोल, एक बोर्न खोल, से आदेश पढ़ता है ~/.profile जब इसे लॉगिन खोल के रूप में बुलाया जाता है।

बैश एक बोर्न-जैसे खोल है। यह आदेश से पढ़ता है ~/.bash_profile जब इसे लॉगिन खोल के रूप में बुलाया जाता है, और यदि वह फ़ाइल मौजूद नहीं है, तो यह पढ़ने की कोशिश करता है ~/.profile बजाय।

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

इसलिए:

  • ~/.profile वह सामान है जो आपके पूरे सत्र पर लागू होता है, जैसे प्रोग्राम लॉग इन करते समय आप प्रारंभ करना चाहते हैं (लेकिन ग्राफिकल प्रोग्राम नहीं, वे एक अलग फ़ाइल में जाते हैं), और पर्यावरण परिवर्तनीय परिभाषाएं।

  • ~/.bashrc वह सामान रखने की जगह है जो केवल बाश के लिए लागू होती है, जैसे उपनाम और फ़ंक्शन परिभाषाएं, खोल विकल्प और त्वरित सेटिंग्स। (आप वहां महत्वपूर्ण बाइंडिंग भी डाल सकते हैं, लेकिन बैश के लिए वे आम तौर पर जाते हैं ~/.inputrc।)

  • ~/.bash_profile के बजाय इस्तेमाल किया जा सकता है ~/.profile, लेकिन यह केवल किसी भी अन्य खोल से नहीं, केवल बैश द्वारा पढ़ा जाता है। (यदि आप अपनी प्रारंभिक फ़ाइलों को एकाधिक मशीनों पर काम करना चाहते हैं तो यह ज्यादातर चिंता का विषय है और आपका लॉगिन खोल उन सभी पर बाश नहीं है।) यह शामिल करने के लिए एक तार्किक स्थान है ~/.bashrc अगर खोल इंटरैक्टिव है। मैं निम्नलिखित सामग्री की सिफारिश करता हूं ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

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

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

¹  अनुरोध के अनुसार पूर्णता के लिए: यदि .bash_profile अस्तित्व में नहीं है, बैश भी कोशिश करता है .bash_loginवापस गिरने से पहले .profile। यह भूलने के लिए स्वतंत्र महसूस करें।  


479
2017-09-02 19:23



अच्छी पोस्ट के लिए +1। "लॉगिन ग्राफिकल बनाम लॉगिन खोल" के बारे में अनुभाग जोड़ने के लिए भी आपको धन्यवाद ... मुझे समस्या थी जहां मैंने सोचा था कि ~ / .profile हमेशा ग्राफिकल / खोल के लिए निष्पादित होगा ... लेकिन जब उपयोगकर्ता लॉग इन करता है तो यह निष्पादित नहीं होता है ग्राफिकल लॉगिन के माध्यम से। रहस्य को हल करने के लिए धन्यवाद। - Trevor Boyd Smith
@Gilles: क्या आप अधिक विस्तार से समझा सकते हैं, उदाहरण के साथ, प्रत्येक टर्मिनल में लॉगिन खोल क्यों चलाना एक बुरा विचार है? क्या यह डेस्कटॉप लिनक्स के साथ ही एक मुद्दा है? (मैं इकट्ठा करता हूं कि ओएस एक्स टर्मिनल पर हर बार एक लॉगिन खोल चलाता है, और मैंने कभी भी साइड इफेक्ट्स नहीं देखा है (हालांकि मैं आमतौर पर आईटर्म का उपयोग करता हूं)। लेकिन फिर मैं कई पर्यावरण चरों के बारे में नहीं सोच सकता जिनके बारे में मुझे परवाह है एक टर्मिनल। (शायद HTTP_PROXY?)) - iconoclast
@ ब्रैंडन यदि आप प्रत्येक टर्मिनल में लॉगिन खोल चलाते हैं, जो पर्यावरण द्वारा प्रदान किए गए पर्यावरण चर को ओवरराइड करेगा। रोजमर्रा की परिस्थितियों में, आप इससे दूर हो सकते हैं, लेकिन यह जल्द ही या बाद में आपको आ जाएगा और जब आप टर्मिनल में अलग-अलग चर सेट अप करना चाहते हैं (कहें, प्रोग्राम के एक अलग संस्करण को आज़माने के लिए): एक चलाना लॉगिन खोल आपकी स्थानीय सेटिंग्स को ओवरराइड करेगा। - Gilles
बयान ~/.bash_profile के बजाय इस्तेमाल किया जा सकता है ~/.profile, लेकिन आपको भी शामिल करने की आवश्यकता है ~/.bashrc अगर खोल इंटरैक्टिव है। यह भ्रामक है क्योंकि ये ऑर्थोगोनल मुद्दे हैं। कोई फर्क नहीं पड़ता कि आप उपयोग करते हैं ~/.bash_profile या ~/.profile आपको शामिल करना होगा ~/.bashrc यदि आप लॉगिन शेल में प्रभाव डालने के लिए वहां से सेटिंग चाहते हैं तो आप इसका उपयोग करते हैं। - Piotr Dobrogost
@Gilles निश्चित रूप से, लेकिन जिस तरह से वाक्य में वाक्य तैयार किया गया है, वह बताता है कि शामिल करने की आवश्यकता है ~/.bashrc चुनने के साथ कुछ करने के लिए है ~/.bash_profile के बजाय ~/.profile जो सच नहीं है। अगर कोई शामिल है ~/.bashrc किसी भी प्रकार की लिपि में लॉगिन समय पर सोर्स किया जा रहा है (यहां यह भी है ~/.bash_profile या ~/.profile) क्योंकि वह सेटिंग्स से चाहता है ~/.bashrc लॉगिन शेल पर लागू होने के लिए उसी तरह वे गैर-लॉगिन खोल पर लागू किए जा रहे हैं। - Piotr Dobrogost


इस से संक्षिप्त लेख

बैश मैन पेज के मुताबिक,   लॉगिन के लिए .bash_profile निष्पादित किया गया है   गोले, जबकि .bashrc के लिए निष्पादित किया गया है   इंटरैक्टिव गैर-लॉगिन गोले।

लॉगिन या गैर-लॉगिन खोल क्या है?

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

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


50
2017-09-02 14:54



थोड़ा अपडेट: 'निष्पादित' शायद थोड़ा भ्रामक शब्द है, वे दोनों सोर्स किए गए हैं। निष्पादित ध्वनियां जैसे कि यह एक स्क्रिप्ट, कांटा / exec yadda yadda के रूप में चलाया जाता है। यह वर्तमान खोल के संदर्भ में चलाया जाता है और अधिक महत्वपूर्ण बात यह है कि .bashrc अधिक बार चलाया जाता है। यह प्रत्येक बैश स्क्रिप्ट रन पर चलाया जाता है, और यदि आपके पास .bash_profile नहीं है। साथ ही, आप अपने xterms को कैसे सेट अप करते हैं, इस पर निर्भर करता है कि आप एक खोल बना सकते हैं जो स्रोत .bash_profile - Rich Homolka


पुराने दिनों में, जब छद्म टीटीई छद्म नहीं थे और वास्तव में, अच्छी तरह से टाइप किए गए थे, और यूनिक्सों को मॉडेम द्वारा एक्सेस किया गया था, तो आप धीमे हो सकते हैं कि आप प्रत्येक स्क्रीन को अपनी स्क्रीन पर मुद्रित कर सकते हैं, दक्षता सर्वोपरि थी। कुछ हद तक दक्षता में मदद करने के लिए आपके पास मुख्य लॉगिन विंडो और वास्तव में काम करने के लिए उपयोग की जाने वाली अन्य विंडो की अवधारणा थी। आपकी मुख्य विंडो में, आप किसी भी नए मेल पर अधिसूचनाएं चाहते हैं, संभवतः पृष्ठभूमि में कुछ अन्य प्रोग्राम चलाएं।

इसका समर्थन करने के लिए, गोले ने एक फाइल सोर्स की .profile खासकर 'लॉगिन गोले' पर। सत्र सेटअप के बाद यह विशेष होगा। बैश ने इसे कुछ हद तक बढ़ाया। Bash_profile पहले .profile, इस तरह आप वहां केवल चीजों को बाश डाल सकते हैं (इसलिए वे बोर्न शेल, आदि को भी खराब नहीं करते हैं, जिसने देखा .profile)। अन्य गोले, गैर-लॉगिन, बस आरसी फाइल, .bashrc (या .kshrc, आदि) स्रोत करेंगे।

यह अब एक अनाचारवाद का एक सा है। आप एक मुख्य शेल में लॉग इन नहीं करते जितना आप गुई विंडो मैनेजर में लॉग इन करते हैं। किसी अन्य विंडो की तुलना में कोई भी मुख्य विंडो नहीं है।

मेरा सुझाव - इस अंतर के बारे में चिंता न करें, यह यूनिक्स का उपयोग करने की पुरानी शैली पर आधारित है। अपनी फाइलों में अंतर को खत्म करें। .Bash_profile की पूरी सामग्री होनी चाहिए:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

और वह सब कुछ डालें जो आप वास्तव में .bashrc में सेट करना चाहते हैं

याद रखें कि .bashrc सभी गोले, इंटरैक्टिव और गैर-इंटरैक्टिव के लिए सोर्स किया जाता है। आप इस कोड को .bashrc के शीर्ष पर रखकर गैर-इंटरैक्टिव शैल के लिए सोर्सिंग शॉर्ट सर्किट कर सकते हैं:

[[ $- != *i* ]] && return


34
2017-09-02 18:10



यह एक बुरा विचार है, देखें मेरा जवाब। विशेष रूप से, आपके पर्यावरण चर केवल टर्मिनल के माध्यम से लॉन्च किए गए कार्यक्रमों में सेट किए जाएंगे, न कि सीधे आइकन या मेनू या कीबोर्ड शॉर्टकट से शुरू किए गए प्रोग्रामों में। - Gilles
@ गिल्स मुझे समझ में नहीं आता कि आप इसका दावा क्यों करते हैं। साथ में .$HOME/.bashrc जैसा कि रिच ऊपर दिखाया गया है, सेटिंग्स में .bashrc लॉगिन गोले में उपलब्ध होगा, और इस तरह डेस्कटॉप वातावरण भी। उदाहरण के लिए, मेरे फेडोरा सिस्टम पर, gnome-session के रूप में शुरू किया गया है -$SHELL -c gnome-session, इसलिए .profile पढ़ा जाता है। - Mikel
@PiotrDobrogost ओह, हाँ, रिच के जवाब के साथ एक और समस्या है। समेत .bashrc में .profile आमतौर पर काम नहीं करता है, क्योंकि .profile द्वारा निष्पादित किया जा सकता है /bin/sh और बाश नहीं (उदा। डिफ़ॉल्ट रूप से एक ग्राफिकल लॉगिन के लिए उबंटू पर), और वह खोल इंटरैक्टिव नहीं हो सकता है (उदा। ग्राफिकल लॉगिन के लिए)। - Gilles
@ गिल्स रे: ".bashrc in .profile सहित" बिल्कुल भी सिफारिश नहीं की गई थी (वास्तव में, वास्तव में)। या तो जवाब संपादित किया गया था (ऐसा नहीं होता है), या आपकी टिप्पणियां जो कहा जा रहा है उसके साथ संरेखित नहीं हैं। - michael
आम तौर पर, +1, लेकिन मैं "शॉर्ट सर्किट ... गैर-इंटरैक्टिव शैल के लिए" की सिफारिश में जोड़ूंगा (".bashrc के शीर्ष के पास: [[ $- != *i* ]] && return"); मुझे कुछ पसंद है .bashrc गैर-इंटरैक्टिव शैल के लिए भी निष्पादित किया जाना चाहिए, विशेष रूप से एनवी वर्र्स सेट करने के लिए, जारी करते समय ssh hostname {command}, ताकि रिमोट कमांड सही तरीके से निष्पादित हो जाएं (भले ही खोल गैर-इंटरैक्टिव है)। लेकिन बाद में अन्य सेटिंग्स .bashrc अनदेखा किया जाना चाहिए। मैं आमतौर पर टीईआरएम = गूंगा और / या अनसेट की जांच करता हूं, और फिर जल्दी से जमानत देता हूं। - michael


कृपया एक नज़र इसे देखिये श्रीवत्सआर द्वारा उत्कृष्ट ब्लॉग पोस्ट। यहां एक निकास है, लेकिन ब्लॉग पोस्ट पर जाएं, इसमें "लॉगिन खोल", प्रवाह चार्ट और Zsh के लिए एक समान तालिका जैसे शब्दों के लिए स्पष्टीकरण शामिल है।

बैश के लिए, वे निम्नानुसार काम करते हैं। उचित कॉलम पढ़ें। ए निष्पादित करता है, फिर बी, फिर सी, आदि बी 1, बी 2, बी 3 का मतलब है कि यह केवल उन फ़ाइलों में से पहला निष्पादित करता है।

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

14
2017-07-13 08:53



एकाधिक प्रश्नों पर एक ही उत्तर पोस्ट करने के बजाय इसे प्राथमिकता दी जाती है यदि आप पूछताछ की विशिष्ट आवश्यकताओं के लिए अपना जवाब तैयार कर सकते हैं। यदि उत्तर दोनों प्रश्नों के लिए बिल्कुल समान है तो आपको मूल प्रश्नों के डुप्लिकेट के रूप में अन्य प्रश्नों को बंद करने के लिए एक ही उत्तर पोस्ट करना और वोट देना चाहिए। - Mokubai♦
@Mokubai अन्य प्रश्न पहले से ही इस के एक डुप्लिकेट के रूप में चिह्नित किया गया है। - Flimm
@ElipticalView: कुछ भी करने के लिए सेट करके, आप लाइन का जिक्र कर रहे हैं: [ -z "$PS1" ] && return? मेरे उत्तर में तालिका स्क्रिप्ट की सामग्री के बावजूद बैश द्वारा संचालित स्क्रिप्ट की सूची दे रही है, यदि स्क्रिप्ट में लाइन है [ -z "$PS1" ] && return, निश्चित रूप से यह प्रभावी होगा, लेकिन मुझे नहीं लगता कि इसका मतलब यह होना चाहिए कि मुझे तालिका बदलनी चाहिए। - Flimm


सिर / ईटीसी / प्रोफाइल के लिए एक बेहतर टिप्पणी

ऊपर फ्लिम के महान उत्तर पर बिल्डिंग, मैंने अपने डेबियन / आदि / प्रोफाइल के प्रमुख पर इस नई टिप्पणी की चिंता की, (आपको इसे अपने distro के लिए समायोजित करने की आवश्यकता हो सकती है।):

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

और यह नोट प्रत्येक अन्य सेटअप फाइलों के सिर पर संदर्भित करने के लिए:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

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

यह भी ध्यान में है कि /etc/bash.bashrc कुछ भी करने के लिए सेट नहीं है जब यह अंतःक्रियात्मक रूप से नहीं चल रहा है। तो ये दो फाइलें केवल इंटरैक्टिव स्क्रिप्ट के लिए हैं।


3
2017-10-18 18:13