.Bash_profile और .bashrc में क्या अंतर है?


245

ओएस एक्स में टर्मिनल के लिए एक उपनाम बनाने के लिए, आप या तो में उपनाम रख सकते हैं .bash_profileया .bashrc। दोनों में क्या अंतर है और मैं एलियासेस को एक में और दूसरे को क्यों नहीं चुनना चाहूंगा?


5
यहां यूनिक्स ज्ञान को हतोत्साहित करने के लिए नहीं, लेकिन बैश एक शुद्ध यूनिक्स जानवर है ताकि आपको बेहतर ज्ञान मिल सके या किसी साथी साइट पर कई बार इस सवाल का जवाब दिया हो। यूनिक्स
bmike

वहाँ भी है। के रूप में अच्छी तरह से ... इस सवाल को स्टैक ओवरफ्लो पर देखें ।
याकोव बारूक

2
यदि आप brew install bashऔर iTerm2 का उपयोग करते हैं, तो आप तय कर सकते हैं कि बाद में डिफ़ॉल्ट रूप profile -> commandसे /usr/local/bin/bashकौन लोड करेगा । यह भी आपको 4 बैश देता है ....bashrc.bash_profile
रे फॉस

मैंने सुना है .bashrc वर्षों से उपयोग नहीं किया गया है, और डिफ़ॉल्ट रूप से काम नहीं करेगा, और .bash_profile macosx में बात है। और मैंने कोशिश की .bashrc और t ने मेरे लिए काम नहीं किया लेकिन। Bash_profile ने किया
barlop

जवाबों:


247

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

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

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

ओएस एक्स पर, टर्मिनल डिफ़ॉल्ट रूप से हर बार एक लॉगिन शेल चलाता है, इसलिए यह अधिकांश अन्य प्रणालियों के लिए थोड़ा अलग है, लेकिन आप वरीयताओं में इसे कॉन्फ़िगर कर सकते हैं।


57
On OS X, Terminal by default runs a login shell every time- मुझे इस बात का अहसास नहीं होने से मैं हमेशा उलझन में रहता हूं। बढ़िया जानकारी!
विघ्न

1
@ एलेक्स, OS X टर्मिनल हर बार लॉगिन शेल क्यों चलाएगा?
पचेरियर

17
'कुछ Apple देव को मूल रूप से अंतर का एहसास नहीं हुआ और अब यह कुछ मंबो जंबो में निहित है।
स्नोक्रैश

2
मैं OS X पर हूं और मैं bash के बजाय zshell, और iTerm का उपयोग टर्मिनल के बजाय करता हूं। इस तथ्य के बावजूद कि मैं चर्चा करने वाले उत्तर की तुलना में एक अलग टर्मिनल और एक अलग शेल का उपयोग कर रहा हूं, ओएस एक्स अभी भी सब कुछ एक लॉगिन शेल पर विचार कर रहा है, क्योंकि .zprofileहर बार भाग जाता है।
एडम ज़ेरनर

1
लॉगिन / नॉन-लॉगिन और इंटरेक्टिव / नॉन-इंटरैक्टिव गोले के संयोजनों की गहन व्याख्या करने वालों के लिए और जब वे इन कॉन्फिग फाइलों को चलाते हैं, तो unix.stackexchange.com/a/46856/38715
kevinmicky

45

X11 आपके .bashrcसमय को देखेगा जबकि एक "नियमित" टर्मिनल दिखेगा.bash_profile

हालाँकि, यदि आप निम्नलिखित को अपने साथ जोड़ते हैं, तो आप .bash_profileअपनी .bashrcफ़ाइल में सब कुछ स्थानांतरित कर सकते हैं ताकि दो के बजाय एक जगह में सब कुछ समेकित करें:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi

या आप बस कर सकते थे cd ~ ; ln -s .bashrc .bash_profile
lhf

5
इन 2 कॉन्फ़िगरेशन फ़ाइलों में एक स्पष्ट रूप से अलग फ़ंक्शन है। कुछ मामलों में, सत्र की शुरुआत में और केवल वहाँ शुरू करने के लिए चीजों का होना आवश्यक है ( ~/.bash_profile)। प्रत्येक शेल स्तर ( ~/.bashrc) पर वृद्धिशील को परिभाषित करने के लिए अक्सर चीजों का होना भी आवश्यक है । इस स्वतंत्रता को दबाने का सुझाव देना सबसे अच्छा विचार नहीं है।
डैन

3
@danielAzuelos: लर्च ने इस हिस्से को छोड़ दिया, लेकिन ~/.bash_profileहर नई विंडो / टैब के लिए OS X टर्मिनल स्रोत , इसलिए वास्तव में दोनों को अलग करने का एक तरीका नहीं है जहां तक ​​टर्मिनल का संबंध है।
मियादी

14
@mipadi उन्हें अलग करने के लिए अभी भी मूल्य है। उदाहरण के लिए, .bash_profileबच्चे की प्रक्रिया में फिर से खट्टा नहीं किया जा सकता है। नेस्टेड बैश स्रोतों के हर स्तर .bashrc, इसलिए यदि आप कुछ ऐसा करते export A=a:$Aहैं .bashrc, तो आपके पास $Aनेस्टेड बैश में अधिक समय होगा। मैं आमतौर पर आरसी में प्रोफाइल, और एलियासेस में पर्यावरण चर छोड़ता हूं।
फ्रैंकलिन यू

@FranklinYu कई लोगों के लिए एक बड़ा सौदा नहीं हो सकता है, लेकिन मैं पूरी तरह से सहमत हूं! यह लोगों को याद दिलाने के लिए और अधिक उत्थान के लिए एक शानदार तकनीकी बिंदु है।
सबफ्यूज़न

24

MacOS के लिए, .bash_profileसब कुछ को समेकित करने का कोड .bashrcनिम्नलिखित है:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

यह मैक टर्मिनल उपयोगकर्ता के लिए अधिक विशिष्ट है।


6
सच है, यह 2012 से लर्च के उत्तर से कैसे अलग है ?
अर्जन

0

TLDR; .bash_profileअपने उपनाम के लिए उपयोग करें।

जिस तरह से अलग-अलग इनिशिएटिव फाइल काम करती हैं, वह थोड़ी अधिक जटिल होती है, और OSX में कुछ महत्वपूर्ण विशेष मामले होते हैं। यहाँ पर प्रकाश डाला गया है:

  • किसी भी प्लेटफ़ॉर्म पर बैश, कई अलग-अलग फ़ाइलों में से एक को निष्पादित करता है, जो इस बात पर निर्भर करता है कि यह कैसे लागू किया जाता है। विवरण यहाँ हैं
  • OSX का टर्मिनल ऐप कुछ गैर-मानक है: यह हर नए टैब या विंडो को बनाता है जैसे कि यह एक लॉगिन शेल था, जिसका अर्थ है कि .bash_profileकहा जाता है। इस प्रकार ऊपर TLDR सलाह।
  • .bashrcएक विकल्प भी है, लेकिन यह कहा जाता है कि हर बार जब आप एक सबहेल्ड बनाते हैं (यानी, आह्वान करते हैं bash), जो अक्षमता पैदा कर सकता है यदि आप इसके भीतर एक चर को अपडेट करते हैं (जैसे, PATH=/bin/foo:$PATH)
  • अन्य ऐप जिनमें एम्बेडेड टर्मिनल हैं वे टर्मिनल ऐप के कन्वेंशन का पालन कर सकते हैं या नहीं। विशेष रूप से, दृश्य स्टूडियो कोड, डिफ़ॉल्ट रूप से, नहीं करता है
  • जीयूआई के माध्यम से आह्वान किए गए एप्लिकेशन एक शेल से पैदा नहीं होते हैं। इस प्रकार, उनके लिए पर्यावरण चर स्थापित करने के लिए कई प्रतिस्पर्धी तंत्र हैं, जो वर्षों में बदल गए हैं
  • स्निपेट्स जो कॉल करते .bashrcहैं .bash_profileवे काफी सामान्य हैं। मैं इसकी अनुशंसा नहीं करता, लेकिन यह एक प्राथमिकता है।

क्यों वास्तव में .bash_profileउपनाम जटिल के लिए उपयोग कर रहा है? जिन वस्तुओं को आप केवल आंशिक रूप से सूचीबद्ध करते हैं, वे सभी उपनामों के बारे में हैं, इसलिए केवल कुछ गोलियों को सूचीबद्ध करने के बजाय, जो यह समझा सकती हैं कि यह जटिल क्यों लगता है क्या आप इन बाधाओं के भीतर इसे आसान बनाने का एक तरीका प्रस्तावित कर सकते हैं?
nohillside

में तुम्हारी बात समझ रहा हूँ। ऐसा नहीं है कि .bash_profile का उपयोग करना जटिल है। यह है कि जिस तरह से फाइल मंगाया गया है वह जटिल है। मैं अपडेट करूंगा।
सिंह

GNU बैश मैनुअल में .bash_profile से .bashrc को कॉल करने की सिफारिश की जाती है - अन्यथा आप चर आदि कैसे सेट करते हैं, जो आपको लॉगिन शेल और गैर-इंटरएक्टिव दोनों की आवश्यकता है?
मार्क

हर टर्मिनल एमुलेटर जो मैं अलग-अलग ओएस पर उपयोग करता हूं, उसके पास सिर्फ दो नाम रखने के लिए एक लॉगिन शेल, एक्सटरम और एक्सफस के रूप में नई विंडो चलाने का विकल्प है।
fd0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.