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


इस प्रश्न का उत्तर यहां दिया गया है:

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

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


174
2017-07-29 03:14


मूल


इस सवाल को डुप्लिकेट के रूप में चिह्नित नहीं किया जाना चाहिए। प्रोफाइल जोड़ा गया प्रश्न में उपलब्ध नहीं है। - Premraj
उत्तर: serverfault.com/q/261802/270464 - Premraj


जवाब:


टी एल; डॉ:

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

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

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

कुछ अन्य नोट्स:

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

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

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

  • सुनिश्चित करें कि ~/.bash_login अस्तित्व में नहीं है।


193
2017-07-29 04:27



+1, यह अनुमति देता है ~/.profile जीडीएम / लाइटडीएम / एलएक्सडीएम जैसी सेवाओं के लिए पर्यावरण को सही ढंग से सेट करने के लिए जो स्पष्ट रूप से / bin / sh चलाते हैं। - grawity
मेरे .bashrc बहुत सारी चीजें आउटपुट करता है, क्या आप उस पर टिप्पणी कर सकते हैं? विशेष रूप से, मुझे ग्रीटिंग आउटपुट कहां रखना चाहिए? - Calimo
@Calimo: इसे इंटरैक्टिव मोड में केवल आउटपुट सामान बनाएं। आप इसका उपयोग कर परीक्षण कर सकते हैं [[ $- == *i* ]], यानी, विशेष में 'मैं' की तलाश है $- चर। बेशक, यह केवल सिस्टम पर पहली जगह पर महत्वपूर्ण है जहां बैश को पढ़ने के लिए संकलित किया गया है .bashrc गैर-इंटरैक्टिव मोड में। (यानी, डेबियन लेकिन आर्क नहीं है।) लेकिन यह उपयोग करने के लिए कनेक्ट करने का प्रयास करते समय रहस्यमय त्रुटि संदेशों का लगातार कारण है sftp या scp या इसी तरह के उपकरण। - grawity
अब मुझे पता होना चाहिए- क्यों .bash_login मौजूद नहीं होना चाहिए? यह क्या करता है? - tedder42
@ tedder42: यह वही करता है .bash_profile तथा .profile। लेकिन बैश केवल तीन में से पहला को पढ़ता है। मतलब, अगर आपके पास है .bash_login, तो दोनों .profile तथा .bash_profile रहस्यमय रूप से अनदेखा किया जाएगा। - grawity


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

आवश्यकताएँ:

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

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

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

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

सरलतम विन्यास होगा:

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

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

    [[$ - == * i *]] || वापसी 0
    
    PS1 = '\ h \ w \ $'
    
    शुरू करें () {सुडो सेवा "$ 1" शुरू करें; }
    

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

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

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

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

    फिर, ज़ाहिर है, अद्यतन ~/.environ सेवा मेरे unset BASH_ENV


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


46
2017-07-29 15:28



अंतिम अनुच्छेद के लिए +1, लेकिन मैं सोर्सिंग पसंद करते हैं .profile तथा .bashrc से .bash_profile और रखरखाव .profile स्वच्छ। - nyuszika7h
@ nyuszika7h: मेरा .profile  साफ है, धन्यवाद। - grawity
प्रत्येक बार जब आप खिड़की खोलते हैं तो टिप्पणी ओएसएक्स के लिए दूसरी तरफ है - Mark
"दोनों होने में बहुत कम बिंदु है ~/.profile तथा ~/.bash_profile": मैं असहमत हूं। क्यों दान के जवाब देखें। - rubenvb
@rubenvb क्या आप प्रासंगिक भाग उद्धृत कर सकते हैं? मुझे लगता है कि केवल एक ही होना ठीक है .profile और गार्ड की रक्षा करें bashसशर्त के साथ विशिष्ट भागों। - Kelvin


कृपया एक नज़र इसे देखिये श्रीवत्सआर द्वारा उत्कृष्ट ब्लॉग पोस्ट। यहां एक निकास है, लेकिन ब्लॉग पोस्ट पर जाएं, इसमें "लॉगिन खोल", प्रवाह चार्ट और 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      |           |      |
+----------------+-----------+-----------+------+

29
2017-07-29 03:39



यह अच्छा है। यह ध्यान रखना महत्वपूर्ण है कि आमतौर पर /etc/profile कॉल /etc/bash.bashrc, तथा ~/.profile कॉल ~.bashrc। तो प्रभावी ढंग से, /etc/bash.bashrc तथा ~/.bashrc इंटरेक्टिव लॉग इन के लिए भी निष्पादित किया जा रहा है। - wisbucky
ध्यान दें कि कुछ वितरण इस योजना को ओवरराइड करते हैं (अजीब परिणामों के साथ) - उदाहरण देखें मेरे बग्रेपोर्ट को यहां खोलने के लिए: bugzilla.opensuse.org/show_bug.cgi?id=1078124 - Christian Herenz


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

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

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


19
2017-07-31 02:45



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


मैंने इसे एक को समझने और एक स्क्रिप्ट बनाने की कोशिश करने पर छोड़ दिया (~/.shell-setup) जो मैं अन्य सभी से स्रोत करता हूं।

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

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

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

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

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

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


0
2017-07-29 03:50





सब कुछ रखो .bashrc और फिर स्रोत .bashrc से .profile

बैश मैन पेज से (ओएस एक्स 10.9 पर):

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

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

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

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

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


-1



-1, ऐसा न करें स्रोत .bashrc से .profile। @ DanRabinowitz का जवाब देखें। - nyuszika7h
कम से कम बिना शर्त। - nyuszika7h
[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc के लिए एक मीठा oneliner होगा .profile। - John WH Smith
@ nyuszika7h, क्यों नहीं? हर कोई लगता है ऐसा करने का सुझाव देने के लिए। - Pacerier