.Bashrc का उद्देश्य क्या है और यह कैसे काम करता है?


जवाबों:


131

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

आप अपने विशेष वातावरण में उपयोग के लिए, या अपनी प्राथमिकताओं में चीजों को अनुकूलित करने के लिए शेल सेट करने के लिए यहां कमांड डालते हैं। एक आम बात यह है कि आप हमेशा उपलब्ध रहना चाहते हैं कि उपनाम में डाल रहे .bashrcहैं ।

.bashrcहर इंटरेक्टिव शेल लॉन्च पर चलता है । अगर आप कहते हैं:

$ bash ; bash ; bash

और फिर Ctrl-Dतीन बार मारा, तीन बार .bashrcचलेगा। लेकिन अगर आप इसके बजाय कहते हैं:

$ bash -c exit ; bash -c exit ; bash -c exit

तब .bashrcबिल्कुल नहीं चलेगा, क्योंकि -cबैश कॉल गैर-संवादात्मक है। जब आप किसी फ़ाइल से शेल स्क्रिप्ट चलाते हैं तो वही सच होता है।

कंट्रास्ट .bash_profileऔर .profileजो केवल एक नए लॉगिन शेल की शुरुआत में चलाए जाते हैं। ( bash -l) आप यह चुनते हैं कि क्या कोई कमांड .bashrcबनाम .bash_profileइस पर निर्भर करता है कि आप इसे एक बार चलाना चाहते हैं या हर इंटरेक्टिव शेल शुरू करना चाहते हैं।

उपनामों के एक प्रतिउत्तर के रूप में, जिसे मैं अंदर रखना पसंद करता हूं .bashrc, आप इसके बजाय PATHसमायोजन करना चाहते हैं .bash_profile, क्योंकि ये परिवर्तन आमतौर पर उदासीन नहीं होते हैं :

export PATH="$PATH:/some/addition"

यदि आप .bashrcइसके बजाय, हर बार जब आपने एक इंटरेक्टिव सब-शेल लॉन्च किया है, :/some/additionतो PATHफिर से अंत में टैकल हो जाएगा, जब आप एक कमांड को गलत करते हैं तो शेल के लिए अतिरिक्त काम करते हैं।

जब भी आप आप एक नया इंटरैक्टिव बैश खोल पाने से बाहर शेलvi के साथ :shउदाहरण के लिए,।


6
माइनर क्विबबल: अधिकांश अन्य गोले के विपरीत, बैश स्वचालित रूप से उस लॉग-इन शेल के रूप में शुरू होने पर प्रति-आवृत्ति कॉन्फ़िगरेशन फ़ाइल को लोड नहीं करता है .bashrc। इससे कभी-कभी अप्रत्याशित व्यवहार हो सकता है । सामान्य वर्कअराउंड स्रोत .bashrcसे .profileया .bash_profileइसके बजाय है।
इल्मरी करोनें

@IlmariKaronen चूंकि .bashrcअन्य गोले द्वारा उपयोग करने का इरादा नहीं है, इसलिए इसे स्रोत से .profile(जो अन्य गैर- bashगोले द्वारा उपयोग किया जा सकता है ) नहीं करना बेहतर है ।
चेपनर

@IlmariKaronen क्या होता है (पढ़ें: कैसे मैं डीबग कर सकते हैं क्यों) जब source ~/.bashrcया . ~/.bashrcया [[ -f ~/.bashrc ]] && source. ~/.bashrcया [ -f ~/.bashrc ] && source ~/.bashrcकाम नहीं करते?
निकोस एलेक्जेंड्रिस

@ नाइकोसलेक्सैंड्रिस: यह एक अलग प्रश्न है। कृपया इसे अलग से पूछें
वॉरेन यंग

@WarrenYoung मैं लेकिन मुझे एहसास हुआ कि .bashrcवास्तव में खट्टा है ( superuser.com/a/183980/128768 से अनुशंसित आदेश का उपयोग करके )। समस्या मैं का सामना करना वास्तव में नहीं की सोर्सिंग है https://github.com/junegunn/fzfइस आदेश के अंदर के माध्यम से .bashrc: source ~/.fzf.bash। मैं एक नया टर्मिनल लॉन्च करता हूं, फिर Ctrl+ Rऔर मुझे मिलता है `__fzf_history__`bash: fzf: command not found। मैं मैन्युअल रूप से स्रोत करता हूं .bashrcऔर वही कुंजी शॉर्टकट अपेक्षित रूप से fzf लॉन्च करता है। यहाँ शोर के लिए क्षमा याचना।
निकोस एलेक्जेंड्रिस

20

एक .bashrcफ़ाइल का उद्देश्य एक ऐसी जगह प्रदान करना है जहां आप चर, फ़ंक्शन और उपनाम सेट कर सकते हैं, अपने (PS1) प्रॉम्प्ट को परिभाषित कर सकते हैं और अन्य सेटिंग्स को परिभाषित कर सकते हैं जो आप हर शुरुआत का उपयोग करना चाहते हैं जो आप एक नई टर्मिनल विंडो खोलते हैं।

हर बार जब आप एक नया टर्मिनल, खिड़की या फलक खोलते हैं तो यह काम करता है।

आप यहां मेरा (सिंटैक्स हाइलाइटिंग वाला चित्र) देख सकते हैं :

HISTCONTROL=ignoreboth:erasedups HISTSIZE=100000 HISTFILESIZE=200000
ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G'
md () { [ $# = 1 ] && mkdir -p "$@" && cd "$@" || echo "Error - no directory passed!"; }
git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; }
HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[\033[01;36m\]>'
set -o vi # vi at command line
export EDITOR=vim
test -f ~/.bash_aliases && . $_
test -f ~/.git-completion.bash && . $_
test -s ~/.autojump/etc/profile.d/autojump && . $_
[ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s autocd
[ -f /etc/bash_completion ] && ! shopt -oq posix && . /etc/bash_completion
[ -z $TMUX ] && export TERM=xterm-256color && exec tmux
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$home/.rvm/scripts/rvm"

स्पष्टीकरण:

-1। डुप्लिकेट को अनदेखा करने और डिफ़ॉल्ट से बहुत बड़ा होने के लिए मेरी इतिहास फ़ाइल सेट करें।
-2। lsआप linux या OSX
-3 का उपयोग कर रहे हैं , इस पर निर्भर करता है के लिए रंग विकल्प । mdएक कमांड
-4 के साथ एक निर्देशिका में बनाने और सीडी करने के लिए " " । यदि एक git रेपो और ...
-5 में वर्तमान git शाखा का पता लगाएं । -9। <code> 20:00:43 durrantm Castle2012 / hom / durrantm / Dropnot / _ / rails_apps / linker master \ n $ _ </ code>
-10 के रूप में, एक भयानक PS1 संकेत परिभाषित करें । बेहतर PS2 प्रॉम्प्ट
-11। Vi को कमांड लाइन
-12 पर संपादक के रूप में सेट करें । Vi को डिफ़ॉल्ट संपादक के रूप में सेट करें
-13। .bash_aliasesअगर यह मौजूद है, तो मेरी फ़ाइल निष्पादित करें
-14। यदि मौजूद है तो मेरी git टैब पूर्ण स्क्रिप्ट (रीमोट और शाखाओं के लिए) निष्पादित करें।
-15। यदि यह मौजूद है, तो Autojump निष्पादित करें
-16। यदि bash संस्करण = = 4 है तो cd भाग टाइप किए बिना cd'ing की अनुमति दें
-17। यदि यह मौजूद है तो एक बैश पूर्ण स्क्रिप्ट निष्पादित करें
-18। यदि यह वर्तमान
-19 है तो TMUX का उपयोग करें । मेरे पेट
-20 में rvm जोड़ें । यदि यह मौजूद है तो rvm का उपयोग करें।

मैंने इसे पोर्टेबल बनाया है ताकि यह बिना अनुकूलन के मेरे किसी भी लिनक्स या OSX मशीनों पर काम करे - इसलिए कुछ कार्यों और अन्य लिपियों का उपयोग करने से पहले उपस्थिति के लिए कई परीक्षण किए जाते हैं।

इससे नई मशीन पर तुरंत पूरी फाइल का उपयोग करना भी आसान हो जाता है, जिसमें नई टर्मिनल विंडो खोलने पर कोई प्रभाव नहीं पड़ता है।


ओवरकिल ... k
Pacerier

है ना? आपके लिए बहुत उपयोगी है?
माइकल ड्यूरेंट

2
शेयर करने के लिए बहुत - बहुत शुक्रिया। जानकारी का खजाना यहाँ।
विकी

7

यह एक bashविन्यास फाइल है।

इंटरएक्टिव (गैर-लॉगिन) गोले, फिर इन फ़ाइलों से कॉन्फ़िगरेशन पढ़ा जाता है:

  • $HOME/.bashrc

लॉगिन शेल के लिए, इन फ़ाइलों से कॉन्फिग रीड की जाती है:

  • /etc/profile (हमेशा खट्टा)
  • $HOME/.bash_profile (इन फ़ाइलों के बाकी क्रम में जाँच की जाती है जब तक कि कोई नहीं मिलता है, तब तक कोई अन्य पढ़ा नहीं जाता है)
  • $HOME/.bash_login
  • $HOME/.profile

कैसे / कब उन्हें लोड किया जाता है इसका सरल चित्रण नीचे दी गई छवि में है।

मैंने echoअपने .bashrcऔर एक को जोड़ा.bash_profile

इंटरएक्टिव शेल बनाम लॉगिन शेल

देखने के man bashबारे में अधिक जानकारी के लिए


2
यह वास्तव में एक पुराने प्रश्न में अतिरिक्त मूल्य नहीं जोड़ता है। इसके अलावा, मैं देखता हूं कि आप यूनिक्स और लिनक्स के लिए नए हैं, पाठ की तस्वीरों को पोस्ट करने की कोशिश न करें, इसके बजाय कोड ब्लॉक फॉर्मेटिंग का उपयोग करना और अपने कंसोल से कॉपी करना बेहतर है। यह पाठ को खोज / कॉपी / आदि करने की अनुमति देता है। आपके उदाहरण के मामले में वास्तव में कोई जटिल आदेश या कुछ भी नहीं है जो खोज करने के लिए अच्छा होगा, लेकिन अन्य उत्तरों के लिए एक अच्छा अभ्यास।
सिपिमाने

1
मुझे यकीन नहीं है कि मैं 'पुराने प्रश्न' के आपके संदर्भ को पूरी तरह से समझता हूं यह शीर्ष प्रश्न सूची में है, और यह 60k विचारों के साथ प्रासंगिक है। मैंने सोचा कि जोड़ा गया मूल्य प्रारूप से आया है, जैसा कि पिछले उत्तरों की तरह एक संवाद / अनुमान के विपरीत है। लेकिन प्रारूप को भी संपादित किया गया है। मैं कोड ब्लॉक का उपयोग करने के बारे में आपकी टिप्पणियों को ध्यान में रखूंगा, धन्यवाद।
टिमोथी एलजे स्टीवर्ट

2
यह 'सक्रिय' प्रश्न सूची के शीर्ष पर है क्योंकि आपने एक उत्तर पोस्ट किया है। सवाल मूल रूप से 2014 में पूछा गया था, और एक जवाब स्वीकार किया। स्वीकृत उत्तर में इसका उद्देश्य बताया गया है .bashrcऔर इसके बीच अंतर को अलग करता है .bashrcऔर .bash_profileजो आपके उत्तर की सामग्री को कवर करता है। हतोत्साहित न हों, आप एक ईमानदार प्रयास को आगे बढ़ाते हैं, लेकिन उन सवालों के जवाब देने पर ध्यान देने की कोशिश करते हैं जिनमें कुछ सामग्री अन्य उत्तरों द्वारा कवर नहीं की जाती है।
सेंटिमेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.