क्यों कोई शेबंग इन .bashrc / .bash_profile?


22

सरल पूछताछ: मुझे अभी पता चला है कि मैंने कभी किसी स्क्रिप्ट के शीर्ष पर शेबंग नहीं देखा है .bashrc, जो मुझे लगता है कि सिस्टम डिफ़ॉल्ट शेल का उपयोग लॉगिन ( ${SHELL}) पर करने के लिए करता है । मैं कई कारणों से विचार कर रहा हूं कि ऐसा क्यों है, यानी लॉगिन स्क्रिप्ट को चलाने के लिए डिफ़ॉल्ट शेल के अलावा किसी अन्य चीज का उपयोग करना एक बुरी आदत माना जाता है।


1
एक कारण है कि इसे बैश
आरसी

जवाबों:


28

.bashrcऔर .bash_profileकर रहे हैं नहीं स्क्रिप्ट। वे कॉन्फ़िगरेशन फ़ाइल प्राप्त करते हैं जो हर बार bash2 तरीकों में से एक में निष्पादित होती हैं:

  • इंटरैक्टिव
  • लॉग इन करें

मंगलाचरण बैश आदमी पृष्ठ के अनुभाग क्या की प्रासंगिक है।

एक लॉगिन शेल वह है जिसका तर्क शून्य का पहला वर्ण है -, या एक --loginविकल्प के साथ शुरू हुआ है ।

एक इंटरैक्टिव शेल गैर-विकल्प तर्कों के बिना शुरू किया गया है और उस -cविकल्प के बिना जिसका मानक इनपुट और त्रुटि दोनों टर्मिनलों से जुड़े हुए हैं (जैसा कि निर्धारित किया गया है isatty(3)), या एक -i विकल्प के साथ शुरू हुआ है । PS1 सेट है और $-इसमें शामिल है iअगर bashकोई शेल स्क्रिप्ट की अनुमति देता है या इस राज्य का परीक्षण करने के लिए एक स्टार्टअप फ़ाइल।

निम्नलिखित पैराग्राफ वर्णन करते हैं कि bashइसकी स्टार्टअप फ़ाइलों को कैसे निष्पादित किया जाता है। यदि कोई भी फाइल मौजूद है, लेकिन पढ़ी नहीं जा सकती, तो bash एक त्रुटि की सूचना देता है। विस्तार अनुभाग में टिल्ड विस्तार के तहत नीचे वर्णित फ़ाइल नामों में टिल्ड का विस्तार किया गया है ।

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

जब एक लॉगिन शेल बाहर निकलता है, तो bash पढ़ता है और फ़ाइल से कमांड निष्पादित करता है ~/.bash_logout, अगर यह मौजूद है।

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

जब वे कमांड लाइन स्विच के माध्यम से लोड हो जाते हैं, --norcऔर आप नियंत्रित कर सकते हैं --noprofile। आप उस स्थान को भी ओवरराइड कर सकते हैं जहां वे --rcfileस्विच का उपयोग करने से लोड होते हैं ।

जैसा कि अन्य ने उल्लेख किया है कि आप कैसे इन फ़ाइलों को source <file>कमांड के उपयोग या कमांड के उपयोग के माध्यम से लोड कर सकते हैं . <file>

इस प्रकार इस कार्यक्षमता के बारे में सोचना सबसे अच्छा है:

  1. बैश एक नंगे वातावरण के साथ शुरू होता है
  2. बैश तो इन फ़ाइलों में से एक को खोलता है (यह कैसे इंटरएक्टिव या लॉगिन के रूप में लागू किया गया था पर निर्भर करता है, और फिर ...
  3. ... लाइन द्वारा लाइन फ़ाइल के भीतर प्रत्येक कमांड निष्पादित करता है ...
  4. जब पूरा एक संकेत के रूप में नियंत्रण देता है, इनपुट की प्रतीक्षा कर रहा है

आह्वान करने के तरीके

यह विषय हर एक बार थोड़ी देर में आने लगता है, इसलिए यहां पर इनवाइट करने के लिए विभिन्न तरीकों की एक छोटी सी चिट्ठी है bashऔर वे इसमें क्या परिणाम देते हैं। नोट: मदद करने के लिए मैंने संदेशों को "$ sourced $ HOME / .bashrc" और "sourced" जोड़ा है। $ HOME / .bash_profile "उनकी संबंधित फ़ाइलों के लिए।

बुनियादी कॉल

  1. बैश -इ

    $ bash -i
    sourced /home/saml/.bashrc
  2. बैश-एल

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  3. bash -il -or- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi

    नोट: ध्यान दें कि -cस्विच या तो फ़ाइल स्रोत नहीं था!

कॉन्फ़िगर की जा रही फ़ाइलों को पढ़ने से अक्षम करना

  1. बैश - nnorc

    $ bash --norc
    bash-4.1$ 
  2. बैश - नोनोप्रोफाइल

    $ bash --noprofile
    sourced /home/saml/.bashrc
  3. बैश - नोरक -इ

    $ bash --norc -i
    bash-4.1$ 
  4. बैश - नोरक -एल

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
  5. बैश - नोनोप्रोफाइल -आई

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
  6. बैश - nnoprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
  7. bash --norc -i -or- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi

बैश कॉल करने के अधिक गूढ़ तरीके

  1. बैश - आर्कफाइल $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 

ये असफल रहे

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found

शायद और भी हैं लेकिन आपको बात मिलती है, उम्मीद है ...।

और क्या?

अंत में यदि आप इस विषय से इतने अधिक रोमांचित हैं कि आप इस पर अधिक पढ़ना / तलाशना चाहते हैं, तो मैं अत्यधिक बैश शुरुआती गाइड, विशेष रूप से अनुभाग: 1.2 पर एक नज़र डालने का सुझाव देता हूं बॉर्न अगेन शेवेल के फायदे"1.2.2.3.3। इंटरएक्टिव शेल व्यवहार" के माध्यम से उस एक, "1.2.2.1। मंगलाचरण" के तहत विभिन्न उपखंड, उन विभिन्न तरीकों के बीच निम्न स्तर के अंतरों की व्याख्या कर सकते हैं जिन्हें आप आमंत्रित कर सकते हैं ।bash


@ संयम - खेद है कि यह थोड़ा हाथ से निकल गया, उम्मीद है कि लोग इसके मूल्य की सराहना करेंगे और इसे अपमान के साथ दंडित नहीं करेंगे। इसके साथ अब हम इसे सड़क के नीचे अन्य उत्तर में भी संदर्भित कर सकते हैं। 8-)। मैं यह दिखाने के लिए एक तालिका बनाने पर विचार कर रहा था, लेकिन वह पागल हो गई होगी 8-)।
स्लम

क्या वास्तव में इनका परीक्षण किया गया है? मैंने एक बार इसका पालन करने की कोशिश की कि मेरा बैश निचोड़ने में क्या करता है और इसने काफी कुछ नहीं किया जैसा कि मैनुअल ने सुझाव दिया था
Banangin

@Bananguin - उन कमांडों में से हर एक मेरे द्वारा चलाया गया था और यह आउटपुट है जो कमांड के नीचे निर्मित किया गया था। मेरे सेटअप के साथ एकमात्र संभावित "बात" हो सकती है कि मेरे .bash_profileस्रोत के लिए एक पंक्ति शामिल है .bashrc। लेकिन मेरा मानना ​​है कि सेटअप का बहुत विशिष्ट होना।
स्लम

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

यह जवाब किसी भी जवाब से बेहतर है यहाँ stackoverflow.com/questions/415403/… !
जैकब टॉमलिंसन 15

13

.bashrcस्क्रिप्ट्स केवल bashअपने आप से चलती हैं । वे स्वतंत्र नहीं हैं, और वे execसिस्टम द्वारा उपयोग किए जाने का इरादा नहीं रखते हैं । (वास्तव में, वे आम तौर पर निष्पादन योग्य चिह्नित नहीं होते हैं, और, जैसा कि आप कहते हैं, उनके पास एक शबंग रेखा नहीं है।)

इस तरह की लिपियों को sourceडी होने का इरादा है , क्योंकि वे आम तौर पर परिवर्तन पर्यावरण चर ( $PATHउदाहरण के लिए) जैसी चीजें करते हैं , जो स्क्रिप्ट के खत्म होने के बाद भी बने रहने की उम्मीद है। इसलिए यह वास्तव में व्यर्थ होगा कि किसी एक को एक सब-डिले में निष्पादित करने का प्रयास करें।


5

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

इससे शेल को चोट पहुंचाने वाली चोट नहीं लगेगी क्योंकि शेबंग को एक नियमित टिप्पणी की तरह संसाधित किया जाएगा, यानी अनदेखा किया जाएगा।

वह संपादकों की मदद कर सकता है जो फ़ाइल में उपयोग की जाने वाली प्रोग्रामिंग भाषा का पता लगाने के लिए सिंटैक्स हाइलाइटिंग का उपयोग करते हैं।

ध्यान दें कि कुछ संपादक vimहालांकि बाद के लिए मॉडल की तरह वैकल्पिक तरीके प्रदान करते हैं। यानी आप हमेशा के अंत में मोड लाइनों रख सकते हैं ~/.bashrcऔर ~/.bash_profileइसलिए तरह:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
@ एसएलएम से ऊपर का स्वीकृत उत्तर बहुत अच्छा है, लेकिन यह वह है जो मैं देख रहा था, .bash_profileशेलचेक की एक सिफारिश पर मेरी शुरुआत में एक शेबंग जोड़ने के संबंध में ।
jlucktay

1

मैं कहीं भी यह नहीं जानता कि वास्तव में कहां है, लेकिन यह सच है

बैश मैनुअल इस क्षेत्र में थोड़ा भ्रमित है, लेकिन बैश शेल स्क्रिप्ट की तरह ~ / .bash_profile eXecute नहीं करता है। यह फ़ाइल को पढ़ता है और फिर इसके भीतर कमांड्स निष्पादित करता है (आप रनिंग सोर्स ~ / .bash_profile द्वारा कुछ ऐसा ही कर सकते हैं)

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