.Bashrc, .profile, .bash_profile, आदि के बीच चयन करना [डुप्लिकेट]


197

इस सवाल का पहले से ही यहाँ एक जवाब है:

यह शर्मनाक है, लेकिन POSIX सिस्टम पूरा समय का उपयोग कर के कई वर्षों के बाद, मैं अभी भी पता लगाना एक कठिन समय है, तो एक खोल अनुकूलन में जाना चाहिए .bashrc, .profileकहीं और, या। कुछ OS- विशिष्ट कॉन्फिग फाइलों का उल्लेख नहीं करना है .pam_environment

हाँ, मुझे पता है कि दस्तावेज़ के माध्यम से पहेली कैसे बनाते हैं और सीखते हैं कि प्रत्येक फ़ाइल कब भरी हुई है या भरी हुई नहीं है। मैं क्या सोच रहा हूँ अगर किसी ने हर तरह के व्यापक दिशा-निर्देश दिए हैं कि कैसे तय किया जाए कि किसी भी प्रकार के अनुकूलन को किस फ़ाइल में डाला जाए।


6
इस सवाल को डुप्लिकेट के रूप में चिह्नित नहीं किया जाना चाहिए कारण जोड़ा गया प्रश्न में .profile उपलब्ध नहीं है।
प्रेमराज

जवाबों:


222

टी एल; डॉ:

  • ~/.bash_profileसुपर-सरल और सिर्फ लोड होना चाहिए .profileऔर .bashrc(उस क्रम में)

  • ~/.profileसामान में विशेष रूप से बैश से संबंधित नहीं है, जैसे पर्यावरण चर ( PATHऔर दोस्त)

  • ~/.bashrcएक इंटरैक्टिव कमांड लाइन पर आप कुछ भी चाहते हैं। EDITORमेरे उपयोग के लिए कमांड प्रॉम्प्ट, वैरिएबल, बैश अलाइज़

कुछ अन्य नोट:

  • कुछ भी जो आलेखीय अनुप्रयोगों के लिए उपलब्ध होना चाहिए या शट (या के रूप में लागू sh) को मिटाना चाहिए~/.profile

  • ~/.bashrc कुछ भी आउटपुट नहीं करना चाहिए

  • कुछ भी जो केवल गोले लॉगिन के लिए उपलब्ध होना चाहिए, अंदर जाना चाहिए ~/.profile

  • सुनिश्चित करें कि ~/.bash_loginमौजूद नहीं है।


3
+1, यह ~/.profileGDM / LightDM / LXDM जैसी सेवाओं के लिए वातावरण को सही ढंग से सेट करने की अनुमति देता है जो स्पष्ट रूप से / बिन / श तक चलते हैं।
विशाल जूल

12
मेरा .bashrcआउटपुट काफी सामान है, क्या आप उस पर टिप्पणी कर सकते हैं? विशेष रूप से, मुझे ग्रीटिंग आउटपुट कहाँ रखना चाहिए?
कैलीमो

14
@ कैलीमो: इसे इंटरेक्टिव मोड में केवल आउटपुट सामान बनाते हैं। आप इसका उपयोग करके परीक्षण कर सकते हैं [[ $- == *i* ]], $-अर्थात् , विशेष चर में 'i' की तलाश कर रहे हैं । बेशक, यह केवल उन प्रणालियों पर पहले स्थान पर मायने रखता है जहां बैश को .bashrcगैर-इंटरैक्टिव मोड में पढ़ने के लिए संकलित किया जाता है। (यही कारण है कि, डेबियन नहीं बल्कि आर्क है।) लेकिन यह का उपयोग करते समय कनेक्ट करने का प्रयास रहस्यमय त्रुटि संदेशों में से एक लगातार कारण है sftpया scpया इसी तरह के उपकरणों।
ग्रेविटी

4
अब मुझे पता चल गया है कि - .bash_login क्यों नहीं होना चाहिए? यह क्या करता है?
tedder42

11
@ tedder42: यह जैसा .bash_profileऔर वैसा ही करता है .profile। लेकिन बैश केवल तीन में से पहले एक को पढ़ता है। मतलब, यदि आप एक है .bash_login, तो दोनों .profileऔर .bash_profileरहस्यमय तरीके से नजरअंदाज कर दिया जाएगा।
ग्रैविटी

54

पिछले कुछ वर्षों में, मेरे पास बर्बाद करने के लिए बहुत समय है, इसलिए मैंने केवल 10 मिनट से थोड़ा अधिक के लिए इस पर शोध किया है। मुझे पता नहीं है कि यह सबसे अच्छा लेआउट है, यह सिर्फ एक है जो बहुत सारे मामलों में सही ढंग से काम करने के लिए होता है।

आवश्यकताएँ:

  • ~/.profile किसी भी / बिन / श के साथ संगत होना चाहिए - इसमें बैश, डैश, ksh शामिल हैं, जो भी एक डिस्ट्रो उपयोग करने के लिए चुन सकता है।

  • पर्यावरण चर को एक फ़ाइल में रखा जाना चाहिए, जो कंसोल लॉगिन्स (यानी 'लॉगिन' शेल) और ग्राफिकल लॉगिन (जैसे कि GDM, LightDM, या LXDM जैसे प्रदर्शन प्रबंधक) द्वारा पढ़ा जाता है।

  • दोनों होने में ~/.profileऔर बहुत कम बिंदु है ~/.bash_profile। यदि उत्तरार्द्ध गायब है, तो बैश खुशी से पूर्व का उपयोग करेगा, और किसी भी बैश-विशिष्ट लाइनों को चेक के लिए $BASHया उसके साथ संरक्षित किया जा सकता है $BASH_VERSION

  • के बीच अलगाव *profileऔर *rcहै कि पूर्व 'लॉगिन' शेल के लिए प्रयोग किया जाता है, और बाद आप टर्मिनल विंडो खोलने हर बार है। हालाँकि, 'लॉगिन' मोड में बैश स्रोत नहीं है ~/.bashrc, इसलिए ~/.profileइसे मैन्युअल रूप से करने की आवश्यकता है।

सबसे सरल विन्यास होगा:

  • एक है ~/.profileकि सभी पर्यावरण चर सेट (bash- विशिष्ट लोगों को छोड़कर), शायद एक लाइन या दो प्रिंट करता है, तो स्रोत ~/.bashrcअगर bash द्वारा चलाया जा रहा है , तो sh- संगत सिंटैक्स से चिपके हुए अन्यथा।

    निर्यात TZ = "यूरोप / पेरिस"
    निर्यात EDITOR = "विम"
    अगर ["$ BASH"]; फिर
        । ~ / .Bashrc
    फाई
    सक्रिय रहने की अवधि
    
  • ऐसा कोई ~/.bashrcभी शेल-विशिष्ट सेटअप करता है, जो इंटरेक्टिव मोड के लिए एक चेक के साथ संरक्षित है जो sftpडेबियन पर चीजों को तोड़ने से बचने के लिए है (जहां बैश को ~/.bashrcगैर-इंटरैक्टिव शेल के लिए लोड करने के विकल्प के साथ संकलित किया गया है ):

    [[$ - == * * *]] || वापसी ०
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo service "$ 1" start; }
    

हालाँकि, समस्या यह भी है कि कुछ गैर-संवादात्मक आदेश (जैसे ssh <host> ls) छोड़ते हैं ~/.profile, लेकिन पर्यावरण चर उनके लिए बहुत उपयोगी होंगे।

  • कुछ वितरण (उदाहरण के लिए डेबियन) ~/.bashrcऐसे गैर-संवादात्मक लॉगिन के लिए स्रोत के विकल्प के साथ उनकी बैश को संकलित करते हैं । इस स्थिति में, मैंने सभी पर्यावरण चर ( export ...लाइनों) को एक अलग फ़ाइल में स्थानांतरित करने के लिए उपयोगी पाया है ~/.environ, और इसे दो बार करने से बचने के लिए एक गार्ड के साथ और दोनों से इसे स्रोत करने के लिए:.profile.bashrc

    अगर ! ["$ PREFIX"]; तो    # या $ संपादक, या $ TZ, या ... 
        । ~ / .environ            # आमतौर पर कोई भी चर जो .environ ही सेट होता है
    फाई
    
  • दुर्भाग्य से, अन्य वितरणों (जैसे आर्क) के लिए, मुझे बहुत अच्छा समाधान नहीं मिला है। एक संभावना निम्नलिखित के द्वारा डालकर (डिफ़ॉल्ट रूप से सक्षम) pam_env PAM मॉड्यूल का उपयोग करना है ~/.pam_environment:

    BASH_ENV =। /। Environ         # एक टाइपो नहीं; यह एक रास्ता होना चाहिए, लेकिन ~ काम नहीं करेगा
    

    फिर, निश्चित रूप से, अद्यतन करने के ~/.environलिए unset BASH_ENV


निष्कर्ष? गोले एक दर्द है। पर्यावरण चर एक दर्द है। डिस्ट्रीब्यूशन-विशिष्ट संकलन-समय विकल्प गधे में एक अत्यधिक दर्द है।


2
अंतिम अनुच्छेद के लिए +1, लेकिन मैं सोर्सिंग पसंद करते हैं .profileऔर .bashrcसे .bash_profileऔर ध्यान में रखते हुए .profileसाफ।
नौसिखिया y

@ nyuszika7h: मेरी .profile सफाई है , धन्यवाद।
grawity

1
हर बार जब आप खिड़की खोलते हैं तो टिप्पणी पर ध्यान दें OSX के लिए दूसरा रास्ता गोल है
मार्क

1
"दोनों होने में बहुत कम बिंदु हैं ~/.profileऔर ~/.bash_profile": मैं असहमत हूं। क्यों के लिए दान का जवाब देखें।
रुबेंव

@rubenvb क्या आप संबंधित भाग को उद्धृत कर सकते हैं? मुझे लगता है कि सशर्त के साथ केवल एक .profileऔर bash-स्पेशल भागों की रक्षा करना ठीक है ।
केल्विन

36

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

बैश के लिए, वे निम्नानुसार काम करते हैं। उपयुक्त कॉलम पढ़ें। ए, फिर बी, सी, आदि बी 1, बी 2, बी 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      |           |      |
+----------------+-----------+-----------+------+

यह अच्छा है। यह ध्यान रखना महत्वपूर्ण है कि आमतौर पर /etc/profileकॉल /etc/bash.bashrc, और ~/.profileकॉल ~.bashrc। इतनी प्रभावी ढंग से, /etc/bash.bashrcऔर ~/.bashrcइंटरएक्टिव लॉगिन के लिए भी निष्पादित किया जा रहा है।
18

ध्यान दें कि कुछ वितरण इस योजना को ओवरराइड करने लगते हैं (विचित्र परिणामों के साथ) - उदाहरण के लिए यहां
खुलने के

Btw। कम से कम बैश के साथ उन फ़ाइलों में से कोई भी निष्पादित नहीं किया जा रहा है जब बैश के माध्यम से बुलाया जा रहा है/bin/sh
जेपीजेड

@ जेपीजेड आप सही कह रहे हैं, यही तीसरा स्तंभ "स्क्रिप्ट" बताता है।
फ्लिम

1
@ फीलम वेल, कॉलम 'स्क्रिप्ट' बताता है कि जब आप बैश (जैसे / बिन / कचरा) के माध्यम से एक गैर-संवादात्मक स्क्रिप्ट शुरू करते हैं तो क्या होता है । हालाँकि, यदि आप किसी स्क्रिप्ट को sh (और / bin / sh के सहारे / bin / bash) के माध्यम से शुरू करते हैं, तो उपरोक्त में से कोई भी निष्पादित नहीं किया गया है (नहीं भी BASH_ENV)। बैश मैन पेज के संबंधित पैराग्राफ को खोजकर पाया जा सकता है If bash is invoked with the name sh
जेपीजेड

21

मैं आपको अपने "व्यापक" दिशानिर्देश प्रदान करता हूं:

  • उदाहरण के लिए, मौजूद होने पर उसे लोड .bash_profileऔर .profileलोड करें.bashrc [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • बाकी सब अंदर डाल दो .bashrc
  • चिंता करना बंद करो।
  • हर चार साल में, दस मिनट खर्च करने से पहले इस सवाल पर शोध करें और "चिंता न करें" पर वापस जाएं।

संपादित करें: किसी को भी यह विश्वास करने के लिए लुभाया जाता है कि सिर्फ "व्यापक" को डराने वाले उद्धरण जोड़े गए हैं। ;)


3
दोनों होने .bash_profileऔर .profileथोड़ा बेमानी है; आपको केवल बाद की आवश्यकता है। आपको इसे / बिन / श-प्रूफ बनाने की ज़रूरत है, हालांकि: if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fiजैसे कि प्रोग्राम (जैसे कि जीडीएम / लाइटमाड) हैं जो मैन्युअल रूप से ए / बिन / श स्क्रिप्ट से फ़ाइल को स्रोत करते हैं। इसका मतलब यह भी है कि रखा गया वातावरण .bashrcअप्रभावी होगा। -1 को था, क्योंकि आपके "व्यापक" दिशानिर्देश कई प्रणालियों पर काम नहीं करेंगे, क्योंकि मैंने कई बार कठिन रास्ता खोज लिया था।
विशाल जूल

कोई बात नहीं, मैं खुशी से एक जवाब के लिए -1 का भुगतान करूंगा जो केवल जीभ-इन-गाल "व्यापक" नहीं है, और आपने निश्चित रूप से उस शीर्षक को अर्जित किया है।
मैकेनिकल फिश

0

मैंने इस एक को जानने की कोशिश में हार मान ली और एक स्क्रिप्ट ( ~/.shell-setup) बनाई जो मैंने दूसरों के लिए बनाई ।

इस दृष्टिकोण ~/.shell-setupमें दो विशेषताएं होनी चाहिए :

  1. केवल एक बार चलाते हैं, यहां तक ​​कि बार-बार खट्टा होने पर ( गार्ड को शामिल करें )
  2. कोई अवांछित आउटपुट उत्पन्न न करें (पता करें कि आउटपुट कब ठीक है)

# 1 बहुत मानक है, हालांकि शेल स्क्रिप्ट में शायद इसका ज्यादा इस्तेमाल नहीं किया गया है।

# 2 मुश्किल है। यहाँ मैं बैश में उपयोग करता हूँ:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

दुर्भाग्य से मुझे याद नहीं है कि मैं कैसे उसके साथ आया था, या एक इंटरैक्टिव शेल का पता लगाने के लिए पर्याप्त क्यों नहीं था।


-2

सब कुछ अंदर .bashrcऔर फिर स्रोत .bashrcसे डालें.profile

बैश मैन पेज से (OS X 10.9 पर):

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

उपरोक्त पाठ यही कारण है कि सब कुछ अंदर रखा गया है .bashrc। हालाँकि, जब आप लॉगिन शेल के साथ काम कर रहे होते हैं तो थोड़ा अलग व्यवहार होता है। फिर, आदमी पृष्ठ से उद्धृत:

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

.profileलॉगिन गोले के लिए पढ़ा जाता है, लेकिन .bashrcऐसा नहीं है। उस सभी सामग्री को डुप्लिकेट .bashrcकरना बुरा ™ है, इसलिए हमें .profileव्यवहार को सुसंगत बनाए रखने के लिए इसे स्रोत की आवश्यकता है ।

हालांकि, अगर आप स्रोत नहीं करना चाहते .bashrcसे .profileबिना शर्त। कृपया अतिरिक्त विवरण के लिए टिप्पणियों और अन्य उत्तरों को देखें।


4
-1, से स्रोत नहीं.bashrc है .profile। @ DanRabinowitz का उत्तर देखें।
9

कम से कम बिना शर्त तो नहीं।
नौसिखिया y

[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrcके लिए एक मधुर oneliner होगा .profile
जॉन डब्ल्यूएच स्मिथ

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