बीच क्या अंतर है .bashrc
और .bash_profile
और जो एक मैं इस्तेमाल करना चाहिए?
.profile
, तो इस प्रश्न पर एक नज़र डालें: superuser.com/questions/789448/…
बीच क्या अंतर है .bashrc
और .bash_profile
और जो एक मैं इस्तेमाल करना चाहिए?
.profile
, तो इस प्रश्न पर एक नज़र डालें: superuser.com/questions/789448/…
जवाबों:
परंपरागत रूप से, जब आप यूनिक्स प्रणाली में प्रवेश करते हैं, तो सिस्टम आपके लिए एक कार्यक्रम शुरू करेगा। वह कार्यक्रम एक शेल है, अर्थात, अन्य कार्यक्रमों को शुरू करने के लिए डिज़ाइन किया गया कार्यक्रम। यह एक कमांड लाइन शेल है: आप इसके नाम को टाइप करके एक और प्रोग्राम शुरू करते हैं। डिफ़ॉल्ट शेल, बॉर्न शेल, ~/.profile
तब से कमांड पढ़ता है जब इसे लॉगिन शेल के रूप में लागू किया जाता है।
बैश एक बॉर्न जैसा खोल है। यह ~/.bash_profile
तब से कमांड पढ़ता है जब इसे लॉगिन शेल के रूप में लागू किया जाता है, और यदि वह फ़ाइल मौजूद नहीं है, तो ~/.profile
इसके बजाय पढ़ने की कोशिश करता है ।
आप किसी भी समय सीधे शेल खोल सकते हैं, उदाहरण के लिए एक GUI वातावरण के अंदर एक टर्मिनल एमुलेटर लॉन्च करके। यदि शेल एक लॉगिन शेल नहीं है, तो यह पढ़ा नहीं जाता है ~/.profile
। जब आप एक इंटरैक्टिव शेल के रूप में बैश करना शुरू करते हैं (यानी, स्क्रिप्ट को चलाने के लिए नहीं), तो यह पढ़ता है ~/.bashrc
(जब एक लॉगिन शेल के रूप में आमंत्रित किया जाता है, तो यह केवल पढ़ता है ~/.bash_profile
या ~/.profile
।
इसलिए:
~/.profile
आपके पूरे सत्र पर लागू होने वाले सामान को रखने के लिए जगह है, जैसे कि आप जब आप लॉग इन करते हैं, लेकिन जब आप ग्राफ़िकल प्रोग्राम नहीं करते हैं, तो वे एक अलग फ़ाइल में जाते हैं, और पर्यावरण चर परिभाषाएँ।
~/.bashrc
सामान रखने की वह जगह है जो केवल खुद को कोसने के लिए लागू होती है, जैसे कि उपनाम और फ़ंक्शन परिभाषा, शेल विकल्प और त्वरित सेटिंग्स। (आप वहां प्रमुख बाइंडिंग भी रख सकते हैं, लेकिन वे आम तौर पर अलग हो जाते हैं ~/.inputrc
।)
~/.bash_profile
can be used instead of ~/.profile
, but it is read by bash only, not by any other shell. (This is mostly a concern if you want your initialization files to work on multiple machines and your login shell isn't bash on all of them.) This is a logical place to include ~/.bashrc
if the shell is interactive. I recommend the following contents in ~/.bash_profile
:
if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
आधुनिक यूनियनों में, इससे जुड़ी एक और जटिलता है ~/.profile
। यदि आप ग्राफ़िकल वातावरण में लॉग इन करते हैं (अर्थात, यदि प्रोग्राम जहाँ आप अपना पासवर्ड ग्राफिक्स मोड में चला रहे हैं), तो आपको स्वचालित रूप से एक लॉगिन शेल नहीं मिलता है जो पढ़ता है ~/.profile
। आपके द्वारा बाद में चलाए जाने वाले विंडो मैनेजर या डेस्कटॉप वातावरण पर, ग्राफ़िकल लॉगिन प्रोग्राम के आधार पर, और आपके वितरण ने इन प्रोग्रामों को कैसे कॉन्फ़िगर किया, यह आपके ~/.profile
पढ़ने या नहीं पढ़ा जा सकता है। यदि यह नहीं है, तो आमतौर पर एक और जगह है जहां आप लॉग इन करने के लिए लॉन्च करने के लिए पर्यावरण चर और कार्यक्रमों को परिभाषित कर सकते हैं, लेकिन दुर्भाग्य से कोई मानक स्थान नहीं है।
ध्यान दें कि आप यहां देख सकते हैं और पर्यावरणीय चर परिभाषाओं को ~/.bashrc
या तो डाल सकते हैं या हमेशा टर्मिनलों में लॉगिन गोले लॉन्च कर सकते हैं । दोनों बुरे विचार हैं। इन विचारों में से किसी एक के साथ सबसे आम समस्या यह है कि आपका पर्यावरण चर केवल टर्मिनल के माध्यम से शुरू किए गए कार्यक्रमों में सेट किया जाएगा, न कि सीधे एक आइकन या मेनू या कीबोर्ड शॉर्टकट के साथ शुरू किए गए कार्यक्रमों में।
¹ पूर्णता के लिए, अनुरोध द्वारा: अगर .bash_profile
मौजूद नहीं है, पार्टी भी कोशिश करता है .bash_login
पर वापस गिरने से पहले .profile
। यह मौजूद है इसे भूलने के लिए स्वतंत्र महसूस करें।
~/.bash_profile
का उपयोग इसके बजाय किया जा सकता है ~/.profile
, लेकिन आपको यह भी शामिल करना ~/.bashrc
होगा कि क्या शेल इंटरैक्टिव है। इन भ्रामक मुद्दों के रूप में भ्रामक है। कोई फर्क नहीं पड़ता कि आप उपयोग करते हैं ~/.bash_profile
या ~/.profile
आपको जो ~/.bashrc
आप उपयोग करना चाहते हैं उसमें शामिल करना है यदि आप वहां से सेटिंग चाहते हैं तो लॉगिन शेल में प्रभाव पड़ेगा।
~/.bashrc
चुनने के साथ कुछ करना है ~/.bash_profile
, ~/.profile
जो सच नहीं है। यदि किसी ~/.bashrc
को किसी भी तरह की स्क्रिप्ट लॉगिन समय (यहाँ यह ~/.bash_profile
या तो है ~/.profile
) में शामिल किया जा रहा है, क्योंकि वह चाहता है कि सेटिंग ~/.bashrc
लॉगिन लॉग पर लागू की जाए जिस तरह से वे गैर-लॉगिन शेल पर लागू हो रहे हैं।
बैश मैन पेज के अनुसार, .bash_profile लॉगिन गोले के लिए निष्पादित किया जाता है, जबकि .bashrc इंटरैक्टिव गैर-लॉगिन गोले के लिए निष्पादित किया जाता है।
लॉगिन या गैर-लॉगिन शेल क्या है?
जब आप कंसोल के माध्यम से लॉगिन (जैसे: उपयोगकर्ता नाम और पासवर्ड) टाइप करते हैं, तो बूटिंग के समय या तो मशीन पर भौतिक रूप से बैठे, या ssh: .bash_profile को प्रारंभिक कमांड प्रॉम्प्ट से पहले चीजों को कॉन्फ़िगर करने के लिए निष्पादित किया जाता है।
लेकिन, यदि आपने पहले से ही अपनी मशीन में लॉग इन किया है और Gnome या KDE के अंदर एक नई टर्मिनल विंडो (xterm) खोलते हैं, तो .bashrc को विंडो कमांड प्रॉम्प्ट से पहले निष्पादित किया जाता है। .bashrc तब भी चलाया जाता है जब आप टर्मिनल में टाइपिंग / बिन / बैश करके एक नया बैश इंस्टेंस शुरू करते हैं।
पुराने दिनों में, जब छद्म ट्टी की छद्म नहीं थी और वास्तव में, अच्छी तरह से टाइप किया गया था, और UNIXes को मॉडेम द्वारा एक्सेस किया गया था ताकि आप प्रत्येक पत्र को अपनी स्क्रीन पर मुद्रित होते देख सकें, दक्षता सर्वोपरि थी। दक्षता में मदद करने के लिए कुछ हद तक आपके पास एक मुख्य लॉगिन विंडो की अवधारणा थी और जो भी अन्य खिड़कियां वास्तव में काम करती थीं। आपकी मुख्य विंडो में, आप किसी भी नए मेल पर सूचनाएँ चाहेंगे, संभवतः पृष्ठभूमि में कुछ अन्य प्रोग्राम चलाएं।
इसका समर्थन करने के लिए, गोले ने .profile
विशेष रूप से 'लॉगिन गोले' पर एक फ़ाइल को सीज किया। यह एक सत्र सेटअप के बाद, विशेष कार्य करेगा। बैश ने इसे पहले .bash_profile को देखने के लिए कुछ हद तक बढ़ा दिया है। पहले, इस तरह से आप केवल चीजों को वहां डाल सकते हैं (इसलिए वे बॉर्न शेल को स्क्रू नहीं करते हैं, आदि, जो कि .profile को भी देखते हैं)। अन्य गोले, गैर-लॉगिन, केवल आरसी फ़ाइल, .bashrc (या .kshrc, आदि) का स्रोत होगा।
यह अब थोडा एनाक्रोसिज्म है। आप एक मुख्य विंडो में लॉग इन नहीं करते हैं जितना कि आप एक gui विंडो मैनेजर में लॉग इन करते हैं। कोई भी मुख्य विंडो किसी भी अन्य विंडो से अलग नहीं है।
मेरा सुझाव - इस अंतर के बारे में चिंता मत करो, यह यूनिक्स के उपयोग की एक पुरानी शैली पर आधारित है। अपनी फ़ाइलों में अंतर को हटा दें। .Bash_profile की संपूर्ण सामग्री होनी चाहिए:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
और वह सब कुछ डालें जो आप वास्तव में .bashrc में सेट करना चाहते हैं
याद रखें कि .bashrc सभी गोले, इंटरैक्टिव और गैर-इंटरैक्टिव के लिए sourced है। आप इस कोड को .bashrc के शीर्ष के पास लगाकर गैर-संवादात्मक गोले के लिए सोर्सिंग शॉर्ट सर्किट कर सकते हैं:
[[ $- != *i* ]] && return
.$HOME/.bashrc
के रूप में अमीर ऊपर से पता चला है, में सेटिंग्स .bashrc
लॉगिन गोले में उपलब्ध हो जाएगा, और इस प्रकार डेस्कटॉप वातावरण के रूप में अच्छी तरह से। उदाहरण के लिए, मेरे फेडोरा सिस्टम पर, gnome-session
जैसा कि शुरू किया गया है -$SHELL -c gnome-session
, .profile
पढ़ा जाता है।
.bashrc
से .profile
काम नहीं चलता है, क्योंकि .profile
हो सकता है कि इसे निष्पादित /bin/sh
न किया जाए और न ही किया जाए (उदाहरण के लिए डिफ़ॉल्ट रूप से ग्राफ़िकल लॉगिन के लिए उबंटू पर), और यह शेल इंटरैक्टिव नहीं हो सकता है (उदाहरण के लिए ग्राफ़िकल लॉगिन के लिए)।
[[ $- != *i* ]] && return
") की सिफारिश को जोड़ूंगा ; मुझे पसंद है कि मेरे कुछ .bashrc
गैर-संवादात्मक गोले के लिए भी निष्पादित किए जाएं, विशेष रूप से जारी करते समय एनवी संस्करण सेट करने के लिए ssh hostname {command}
, ताकि दूरस्थ कमांड सही तरीके से निष्पादित हो जाएं (भले ही शेल गैर-संवादात्मक हो)। लेकिन बाद में अन्य सेटिंग्स .bashrc
को अनदेखा किया जाना चाहिए। मैं आमतौर पर TERM = डंबल और / या अनसेट के लिए जाँच करता हूं, और फिर जल्दी बाहर निकल जाता हूं।
श्रीवत्सआर की इस बेहतरीन ब्लॉग पोस्ट पर एक नजर । यहां एक उद्धरण है, लेकिन ब्लॉग पोस्ट पर जाएं, इसमें "लॉगिन शेल", एक फ्लो चार्ट और ज़श के लिए एक समान तालिका जैसे शब्दों के लिए स्पष्टीकरण शामिल है।
बैश के लिए, वे निम्नानुसार काम करते हैं। उपयुक्त कॉलम पढ़ें। ए, फिर बी, सी, आदि बी 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 | | |
+----------------+-----------+-----------+------+
[ -z "$PS1" ] && return
:? मेरे उत्तर की तालिका बैश द्वारा चलाए जाने वाले लिपियों की सूची को दे रही है, भले ही लिपियों की सामग्री की परवाह किए बिना, यदि स्क्रिप्ट में ही लाइन है [ -z "$PS1" ] && return
, जो प्रभावी होगी, लेकिन मुझे नहीं लगता कि इसका मतलब यह होना चाहिए कि मुझे बदलना चाहिए तालिका।
/ ईटीसी / शख्सियत के लिए एक बेहतर टिप्पणी
ऊपर Flimm के महान जवाब पर बिल्डिंग, मैं अपने डेबियन / etc / प्रोफ़ाइल के सिर पर इस नई टिप्पणी insered, (यदि आप अपने distro के लिए इसे समायोजित करने की आवश्यकता हो सकती है।) :
# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found. (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# | | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# | | login | non-login |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | ALL USERS: | | | |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV | | | A | not interactive or login
# | | | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile | A | | | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc | (A) | A | | Better PS1 + command-not-found
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh| (A) | | |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh | (A) | | | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh | (A) | | |
# +---------------------------------+-------+-----+------------+
# | | | | |
# | A SPECIFIC USER: | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile (bash only) | B1 | | | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bash_login (bash only) | B2 | | | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile (all shells) | B3 | | | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc (bash only) | (B2) | B | | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# | | | | |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout | C | | |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)
और यह नोट इसे संदर्भित करने के लिए अन्य सेटअप फ़ाइलों में से प्रत्येक के सिर पर है:
# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE
वर्थ नोटिंग मुझे लगता है कि डिफ़ॉल्ट स्रोतों से डेबियन / आदि / प्रोफ़ाइल (शामिल) /etc/bash.bashrc (यह तब है जब /etc/bash.bashrc मौजूद है)। इसलिए लॉगिन स्क्रिप्ट दोनों / आदि फ़ाइलों को पढ़ते हैं, जबकि गैर-लॉगिन केवल bash.bashrc पढ़ता है।
यह भी ध्यान दें कि /etc/bash.bashrc कुछ भी नहीं करने के लिए सेट है जब यह अंतःक्रियात्मक रूप से नहीं चलता है। इसलिए ये दोनों फाइलें केवल इंटरैक्टिव स्क्रिप्ट के लिए हैं।
बाश के खुद के कॉन्फ़िगरेशन तर्क पागल जटिल नहीं है और इस पृष्ठ पर अन्य उत्तर में सर्वरफॉल्ट और कई ब्लॉगों में समझाया गया है। हालांकि समस्या यह है कि लिनक्स वितरण क्या बैश करता है , मेरा मतलब है कि वे जटिल और विभिन्न तरीकों से डिफ़ॉल्ट रूप से बैश को कॉन्फ़िगर करते हैं। http://mywiki.wooledge.org/DotFiles में इनमें से कुछ उद्धरणों का संक्षेप में उल्लेख किया गया है। फेडोरा 29 पर यहां एक नमूना ट्रेस है, यह दिखाता है कि कौन सी फाइल स्रोत है जो अन्य फ़ाइल (एस) और किस क्रम में एक बहुत ही सरल परिदृश्य के लिए: दूरस्थ रूप से ssh के साथ जुड़ना और फिर एक और उपधारा शुरू करना:
ssh fedora29
└─ -bash # login shell
├── /etc/profile
| ├─ /etc/profile.d/*.sh
| ├─ /etc/profile.d/sh.local
| └─ /etc/bashrc
├── ~/.bash_profile
| └─ ~/.bashrc
| └─ /etc/bashrc
|
|
└─ $ bash # non-login shell
└─ ~/.bashrc
└─ /etc/bashrc
└─ /etc/profile.d/*.sh
फेडोरा का सबसे जटिल तर्क है /etc/bashrc
। जैसा कि ऊपर देखा गया है /etc/bashrc
कि एक फाइल बैश के बारे में खुद ही नहीं पता है, मेरा मतलब सीधे नहीं है। फेडोरा के /etc/bashrc
परीक्षण चाहे:
... और फिर उन पर निर्भर करता है पूरी तरह से अलग बातें करता है।
अगर आपको लगता है कि ऊपर दिए गए ग्राफ को याद कर सकते हैं तो बहुत बुरा है क्योंकि यह लगभग पर्याप्त नहीं है: यह ग्राफ केवल एक परिदृश्य का वर्णन करता है, गैर-संवादात्मक स्क्रिप्ट चलाने या ग्राफिकल सत्र शुरू करने पर थोड़ा अलग चीजें होती हैं। मैंने छोड़ दिया है ~/.profile
। मैंने bash_completion
स्क्रिप्ट्स को छोड़ दिया है । पिछड़े अनुकूलता कारणों के लिए, इसके व्यवहार /bin/sh
को /bin/bash
बदलने के बजाय बैश को लागू करना। क्या zsh और अन्य गोले के बारे में? और निश्चित रूप से अलग-अलग लिनक्स वितरण अलग तरीके से करते हैं, उदाहरण के लिए डेबियन और उबंटू बेस एच के एक गैर-मानक संस्करण के साथ आते हैं , इसमें डेबियन-विशिष्ट अनुकूलन (ओं) हैं। यह विशेष रूप से एक असामान्य फ़ाइल के लिए दिखता है:/etc/bash.bashrc
। यहां तक कि अगर आप एक ही लिनक्स वितरण से चिपके रहते हैं, तो संभवतः यह समय के साथ विकसित होता है। प्रतीक्षा करें: हमने macOS, FreeBSD को भी नहीं छुआ है, ... अंत में, आइए उन उपयोगकर्ताओं के लिए विचार करें जो अधिक रचनात्मक तरीकों से अटके हुए हैं, जिनके प्रवेश ने उनके द्वारा उपयोग की जाने वाली प्रणाली को कॉन्फ़िगर किया है।
जैसा कि इस विषय पर चर्चाओं की कभी न खत्म होने वाली धारा प्रदर्शित करती है, यह एक खोया हुआ कारण है। जब तक आप नए मूल्यों को जोड़ना चाहते हैं, तब तक कुछ "परीक्षण और त्रुटि" पर्याप्त हो जाते हैं। असली मज़ा तब शुरू होता है जब आप एक (उपयोगकर्ता) फ़ाइल को संशोधित करना चाहते हैं जो पहले से ही दूसरे (/ आदि) में परिभाषित कुछ है। फिर कुछ समय इंजीनियरिंग को हल करने के लिए तैयार रहें जो कभी भी पोर्टेबल नहीं होगा।
जून 2019 तक स्पष्ट लिनक्स पर समान, सरल परिदृश्य के लिए यहां अंतिम मजाक के लिए:
ssh clearlinux
└─ -bash # login shell
├── /usr/share/defaults/etc/profile
| ├─ /usr/share/defaults/etc/profile.d/*
| ├─ /etc/profile.d/*
| └─ /etc/profile
├── ~/.bash_profile
|
|
└─ $ bash # non-login shell
├─ /usr/share/defaults/etc/bash.bashrc
| ├─ /usr/share/defaults/etc/profile
| | ├─ /usr/share/defaults/etc/profile.d/*
| | ├─ /etc/profile.d/*
| | └─ /etc/profile
| └─ /etc/profile
└─ ~/.bashrc