समझ .bashrc और .bash_profile


26

एक सर्वर पर जब मैं रूट के रूप में लॉगिन करता हूं तो मैं देखता हूं .bashrc(Ubuntu 10.10)।

मेरे मैक पर मैं एक है .bash_profile

क्या उबंटू में हमेशा केवल एक .bashrcफाइल होती है और नहीं .bash_profile? (मैं बस उलझन में हूं, इसलिए पूछ रहा हूं, मुझे एहसास है कि वे अलग-अलग ओ / एस हैं लेकिन शायद किसी तरह एक रिश्ता है?)

अपने सर्वर पर, मैं एक उपनाम बनाना चाहता हूं, क्या मुझे इसे अंदर रखना चाहिए .bashrc?

यदि मैं चाहता हूं कि यह उपनाम लागू किया जाए तो सभी उपयोगकर्ता इसका उपयोग कर सकते हैं?


1
संभवतः इसके डुप्लिकेट: askubuntu.com/questions/1528/bashrc-or-bash-profile - मैं आपको सलाह दूंगा कि आप अपना सवाल बदलने के लिए पूछें कि विश्व स्तर पर उपनाम कहां रखें।

जवाबों:


39

बैश उपनामों को व्यक्तिगत घर निर्देशिकाओं में .bash_aliasesया .bashrcफाइलों में जाना चाहिए । यदि आपको वैश्विक बैश उपनाम बनाने हैं, तो वे अंदर जा सकते हैं /etc/bash.bashrc, लेकिन अक्सर उन्हें केवल उन फ़ाइलों .bash_aliasesया .bashrcफाइलों में जोड़ना सबसे अच्छा होता है, /etc/skelताकि वे नए बनाए गए उपयोगकर्ताओं को विरासत में मिले।

यह है लगभग हमेशा गलत में में एक उपनाम परिभाषित करने के लिए .profile, .bash_profileया /etc/profile

यह समझने के लिए कि, किसी को यह समझना चाहिए कि इन फ़ाइलों में से प्रत्येक को किन परिस्थितियों से चलाया जाता है। इस बारे में गलत धारणाएं हैं, जिन्हें मैं नीचे संबोधित करता हूं।

भले ही आप कई उपयोगकर्ताओं के लिए उपनामों को परिभाषित करना चाहते हैं, आपको इस बात से परिचित होना चाहिए कि वे अलग-अलग उपयोगकर्ताओं के लिए कैसे परिभाषित किए जाते हैं, ताकि आप अपनी ज़रूरत के सर्वोत्तम तरीके पर निर्णय ले सकें।

व्यक्तिगत उपयोगकर्ताओं के लिए उपनाम

खासकर यदि आप एक GUI का उपयोग करते हैं, तो आपके अधिकांश इंटरेक्टिव गोले संभवतः गैर-लॉगिन गोले हैं। यहां तक ​​कि अगर आप कभी GUI का उपयोग नहीं करते हैं, तो भी आप शायद कुछ आवृत्ति के साथ गैर-लॉगिन गोले का उपयोग करते हैं । आप अपने उपनामों को इन गोले में काम करना चाहते हैं।

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

जब एक इंटरैक्टिव, गैर-लॉगिन शेल शुरू होता है , तो यह .bashrcउपयोगकर्ता के होम डायरेक्टरी में होता है। उबंटू में डिफ़ॉल्ट रूप से, प्रत्येक उपयोगकर्ता के .bashrcस्वयं के स्रोत .bash_aliases, यदि यह मौजूद है।

  • किसी फ़ाइल को स्रोत करने के लिए अपनी सामग्री को वर्तमान शेल में चलाने का कारण है । किसी फ़ाइल में बनाई गई शेल वातावरण में परिवर्तन, जो फ़ाइल में सभी कमांड चलने के बाद भी बना रहता है।

उबंटू के डिफ़ॉल्ट में टिप्पणियाँ पढ़ी .bashrcपता चलता है कि यह है आधिकारिक तौर पर इरादा है कि उपनाम में जाना .bashrcया .bash_aliases.bashrcपहले से ही कुछ अन्य परिभाषाएँ हैं ( grep '^[[:blank:]]*alias' ~/.bashrcउन्हें देखने के लिए दौड़ें ), और इस तरह की नई परिभाषाएँ कहाँ रखें, इस बारे में स्पष्ट सलाह देता है:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

लेकिन इंटरैक्टिव लॉगिन गोले के बारे में क्या ? इसके बजाय .bashrc, लॉगिन गोले स्रोत .profile

  • ... जब तक .bash_loginमौजूद नहीं है, तब तक इसके बजाय खट्टा हो जाता है।
  • ... जब तक .bash_profileमौजूद है, तो यह बजाय sourced हो जाता है।

हालांकि, अच्छी खबर यह है कि उबंटू में डिफ़ॉल्ट रूप से, है में आदेश .bashrcहोगा भी इंटरैक्टिव लॉगिन गोले में चला क्योंकि डिफ़ॉल्ट .profileजांच करता है कि वर्तमान खोल bash है (और यदि .bashrcमौजूद है), और यदि हां, सूत्रों का कहना है .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

मेरा सुझाव है कि उपयोगकर्ता .bash_aliasesअपने घर निर्देशिकाओं में नए बैश उपनामों को परिभाषित करें (यदि यह पहले से मौजूद नहीं है तो इसे बनाना)। यह एक विशेष रूप से स्वच्छ और सरल तरीका है, जो प्रति उपयोगकर्ता स्तर पर उपनाम की परिभाषा को स्थायी बनाता है।

उपनामों को परिभाषित नहीं किया जाना चाहिए.profile क्योंकि वे गैर-लॉगिन गोले में अपरिभाषित रहेंगे। बैश शेल के अधिकांश वातावरण के विपरीत, एलियाज़ को बच्चे के गोले में निर्यात नहीं किया जाता है:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

विशेष रूप से, डिफ़ॉल्ट रूप से अधिकांश डेस्कटॉप वातावरण .profileचित्रमय लॉगिन पर स्रोत बनाए जाते हैं, लेकिन:

  1. यह आवश्यक रूप से बैश शेल द्वारा नहीं किया जाता है, इसलिए अन्य परिभाषाओं को संसाधित भी नहीं किया जा सकता है, और इससे भी महत्वपूर्ण बात
  2. यहां तक ​​कि अगर उर्फ ​​परिभाषाओं को संसाधित किया जाता है, तो वे बाल प्रक्रियाओं पर पारित नहीं होते हैं । विशेष रूप से, वे एक टर्मिनल विंडो खोलकर बनाए गए गोले पर पारित नहीं होते हैं!

उपनाम को.bash_profile.bash_login उसी कारण से (या ) में परिभाषित नहीं किया जाना चाहिए , बल्कि किसी अन्य कारण से भी। Naively इन फ़ाइलों में से एक बना रहा है और इसमें केवल अन्य परिभाषाएँ डाल रहा है और किसी भी कोड .profileको चलने से रोकता है !

ऐसी स्थितियों में जहां .bash_profileया .bash_loginवास्तव में उपयोगी है, आम तौर पर उनमें .profileकहीं एक स्रोत है, जो उस समस्या को हल करता है। (तब केवल शेष समस्या यह है कि जैसे .profile, उपनामों को परिभाषित करना .bash_profileया .bash_loginसही काम नहीं करना।)

नए व्यक्तिगत उपयोगकर्ताओं के लिए उपनाम , स्वचालित रूप से

जब एक वास्तविक मानव का प्रतिनिधित्व करने के लिए इच्छित प्रकार का एक उपयोगकर्ता खाता बनाया जाता है, तो एक नई निर्देशिका आमतौर पर उनके घर की निर्देशिका के रूप में बनाई जाती है। सामग्री /etc/skelको फिर उनके घर निर्देशिका में कॉपी किया जाता है। यह है कि कैसे कई उपयोगकर्ताओं को अपने घर निर्देशिका में कुछ इसी तरह की विन्यास फाइल के साथ शुरू करते हैं। उबंटू में, यह भी शामिल है .profile, .bashrcऔर कुछ अन्य फ़ाइलों।

नए उपयोगकर्ताओं के लिए उपनाम क्या हैं, इसे बदलने के लिए, आप बस उन्हें डाल सकते हैं /etc/skel/.bash_aliases(आपको इसे बनाना होगा) या /etc/skel/.bashrc

यदि आप पहले से मौजूद फ़ाइल को संपादित करते हैं, तो आप /etc/skelइसे पहले बैकअप देना चाहते हैं - लेकिन आपको बैकअप को नहीं रखना चाहिए /etc/skel, या इसे नए उपयोगकर्ताओं के होम निर्देशिका में कॉपी किया जाएगा।

यह संभवतः आपके लिए कई उपयोगकर्ताओं के लिए नए उपनाम जोड़ने का सबसे अच्छा तरीका है। मौजूदा उपयोगकर्ता केवल खुद को उपनाम जोड़ सकते हैं। यदि आप उपनामों को परिभाषित करते हैं /etc/skel/.bash_aliases, तो आप बस उन्हें उस फ़ाइल पर निर्देशित कर सकते हैं, जिसे वे अपने होम निर्देशिका में कॉपी करना चुन सकते हैं (या अपनी स्वयं की कस्टम .bash_aliasesफ़ाइल में जोड़ सकते हैं )।

यह उपयोगकर्ता के लिए एक उपनाम को अपरिभाषित करने के लिए तुच्छ है। इसके अतिरिक्त, उपनाम बेहद मजबूत नहीं हैं ; वे केवल विशेष परिस्थितियों में काम करते हैं। यदि आपको एक नई कमांड बनाने की आवश्यकता है जो हर समय काम करती है, तो सभी के लिए , आपको उस आदेश को एक उपनाम के रूप में लागू नहीं करना चाहिए। और आप सफलतापूर्वक उन उपयोगकर्ताओं पर एलियंस को मजबूर नहीं कर सकते जो उन्हें नहीं चाहते हैं - वे बस unaliasउन्हें कर सकते हैं।

वैश्विक उपनाम, सभी उपयोगकर्ताओं के लिए

यद्यपि मैं आपको इस दृष्टिकोण से बचने की सलाह देता हूं, आप वैश्विक फ़ाइल में उपनामों को परिभाषित कर सकते हैं । फिर उन्हें इंटरएक्टिव नॉन-लॉगिन शेल के लिए और इंटरेक्टिव लॉगिन शेल के लिए परिभाषित किया जाएगा। उपयोगकर्ता के होम डायरेक्टरी में किसी भी फाइल के खट्टे होने से पहले , इसका कारण है : /etc/bash.bashrc

  • लॉगिन गोले (और केवल लॉगिन गोले और लॉगिन गोले की तरह व्यवहार करने वाली अन्य प्रक्रियाएं) /etc/profileस्वचालित रूप से कमांड चलाते हैं ।
  • केवल गैर-लॉगिन शेल /etc/bash.bashrcस्वचालित रूप से कमांड चलाते हैं , लेकिन
  • उबंटू की डिफ़ॉल्ट /etc/profileजाँच करता है कि रनिंग शेल बैश है (और यदि /etc/bash.bashrcमौजूद है) और, यदि हां, तो स्रोत /etc/bash.bashrc

यह इस बात के अनुरूप है कि शेल .profileप्रति .bashrcbash (जैसा कि ऊपर विस्तृत है) प्रति डिफ़ॉल्ट उपयोगकर्ता प्रति उपयोगकर्ता कैसे करता है ।

यह देखने के लिए कि डिफ़ॉल्ट में कैसा दिखता है /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

वह ब्लॉक अन्य कार्यों को भी करता है। विशेष रूप से, बाहरी ifजांचें कि यदि शेल संवादात्मक होने की संभावना है (यह जांच कर कि शीघ्र पाठ गैर-रिक्त है), तो यह जांचता है कि क्या वर्तमान शेल बैश है और स्रोत /etc/bash.bashrcयदि यह है, और यदि वह काम नहीं करता है, तो बैश के लिए में पहले से ही है /etc/bash.bashrc

आपको वैश्विक उपनामों को परिभाषित नहीं करना चाहिए /etc/profileउसी कारण से उपयोगकर्ताओं को उन्हें अपने स्थानीय .profileएस में परिभाषित नहीं करना चाहिए : यदि आप करते हैं, तो उन्हें केवल लॉगिन गोले के लिए परिभाषित किया जाएगा, न कि उनके बच्चे के गोले के लिए।

अंत में, ध्यान दें कि डिफ़ॉल्ट प्रति उपयोगकर्ता के विपरीत .bashrc, डिफ़ॉल्ट /etc/bash.bashrcफ़ाइल में उपनामों के बारे में कुछ भी नहीं है। उपयोगकर्ताओं को किसी फ़ाइल में उपनाम देना असामान्य है जहां वे उन्हें संपादित या अक्षम नहीं कर सकते। (बेशक, वे अभी भी कर सकते हैं कि करते हैं, अपने खुद के स्थानीय में उनकी परिभाषा अधिभावी द्वारा .bashrc, .bash_aliases, या कहीं और।)

आगे की पढाई


5

यहाँ पर कुछ अच्छा पढ़ना है। ".bash_profile लॉगिन गोले के लिए निष्पादित किया जाता है, जबकि .bashrc इंटरैक्टिव गैर-लॉगिन दूरी के लिए निष्पादित किया जाता है"

तो अपने उपनाम के लिए, .bash_profile का उपयोग करें


4
उपनाम डालना .bash_profileसही नहीं है। उबंटू में, .profile(जो लॉगिन गोले के लिए चलता है) स्रोत .bashrcजब यह एक इंटरैक्टिव बैश शेल होता है। इस प्रकार एलियास को .bashrc(या .bash_aliases, खट्टे में .bashrc) डालकर उन्हें सभी इंटरैक्टिव बैश शेल में परिभाषित किया जाता है । अन्य लोगों में इस समस्या से.bash_profile उपज होती है। देखें इस , कि , मेरा उत्तर , और डिफ़ॉल्ट की डाल उपनाम वहाँ या में की सिफारिश की टिप्पणियां । ~/.bashrc.bash_aliases
एलिया कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.