टर्मिनल खोलने के दौरान क्यों ~ / .bash_profile को खट्टा नहीं किया जा रहा है?


175

मुसीबत

मेरे पास एक उबंटू 11.04 वर्चुअल मशीन है और मैं अपने जावा विकास वातावरण को स्थापित करना चाहता था। मैंने इस प्रकार किया

  1. sudo apt-get install openjdk-6-jdk
  2. निम्नलिखित प्रविष्टियों को ~ / .bash_profile में जोड़ा गया

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
  3. परिवर्तन सहेजें और बाहर निकलें

  4. फिर से एक टर्मिनल खोलें और निम्नलिखित टाइप करें

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
  5. ऐसा कुछ भी नहीं हुआ, जैसे कि JAVA_HOME का निर्यात और यह PATH के अलावा कभी नहीं हुआ।

उपाय

मुझे ~ / .bashrc पर जाना था और फ़ाइल के अंत में निम्नलिखित प्रविष्टि जोड़ना था

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

प्रशन

  1. मुझे ऐसा क्यों करना पड़ा? मैंने सोचा कि उन दोनों की अनुपस्थिति में bash_profile, bash_login या प्रोफ़ाइल पहले bashrc से पहले निष्पादित हो जाते हैं।
  2. क्या इस मामले में मेरा टर्मिनल एक गैर-लॉगिन शेल था?
  3. यदि ऐसा है, तो क्यों टर्मिनल के बाद सु और पासवर्ड डालते समय यह प्रोफ़ाइल निष्पादित नहीं करता था, जहां मैंने ऊपर उल्लिखित निर्यात भी निर्धारित किया था?

जवाबों:


223

~/.bash_profileइंटरैक्टिव लॉगिन मोड में शुरू होने पर केवल बैश द्वारा खट्टा होता है। यह आमतौर पर केवल तब होता है जब आप कंसोल ( Ctrl+ Alt+ F1.. F6) पर लॉगिन करते हैं , या ssh के माध्यम से कनेक्ट होते हैं।

जब आप ग्राफ़िकल रूप से लॉग इन करते हैं, ~/.profileतो विशेष रूप से उस स्क्रिप्ट से सॉर्ट किया जाएगा जो सूक्ति-सत्र (या जो भी डेस्कटॉप वातावरण का उपयोग कर रहा है) लॉन्च करता है। ~/.bash_profileजब आप ग्राफ़िकल रूप से लॉग इन करते हैं तो बिल्कुल भी खट्टा नहीं होता है।

जब आप एक टर्मिनल खोलते हैं, तो टर्मिनल (गैर-लॉगिन) इंटरएक्टिव मोड में बाश करना शुरू कर देता है, जिसका अर्थ है कि यह स्रोत होगा ~/.bashrc

आपके लिए इन पर्यावरण चर को रखने का सही स्थान है ~/.profile, और जब आप लॉग इन करते हैं तो इसका प्रभाव अगली बार स्पष्ट होना चाहिए।

सोर्सिंग ~/.bash_profileसे ~/.bashrcगलत समाधान है। यह दूसरी तरह के आसपास माना जाता है; ~/.bash_profileस्रोत होना चाहिए ~/.bashrc

DotFiles को अधिक गहन विवरण के लिए देखें , इसमें कुछ इतिहास भी शामिल है कि यह ऐसा क्यों है।

(एक तरफ ध्यान दें, जब apt के माध्यम से Openjdk को स्थापित किया जा रहा है, तो सिम्बलिंक को पैकेज द्वारा सेट किया जाना चाहिए, ताकि आपको वास्तव में सेट JAVA_HOMEया बदलने की आवश्यकता न हो PATH)


6
मैंने पाया है कि Ubuntu 12 में साइडबार से एक टर्मिनल खोलने पर ~ / .profile फ़ाइल लोड नहीं होती है।
जुल्म

3
@jcollum यह अच्छा है। .profileजब आप लॉग इन करें तो केवल
खट्टा

2
ओह, टर्मिनल खोलना लॉग इन करने के समान नहीं है ... मैं सोच रहा था कि टर्मिनल में लॉगिंग कर रहा हूं ।
जूलम

2
भालू को ध्यान में रखें जो मौजूद होने पर .profileबैश द्वारा नजरअंदाज कर दिया जाता .bash_profileहै। मेरा जवाब यहां देखें और man bashअधिक जानकारी के लिए।
टेराडो

3
@terdon, हाँ, लेकिन बैश रेखांकन में लॉग इन करते समय शामिल नहीं होता है, इसलिए यह सीधे जाता है .profile
जिरह

48

आप जाँच कर सकते हैं कि क्या आपका बैश शेल चालू हो कर लॉगिन-शेल के रूप में है:

shopt login_shell

यदि उत्तर है offतो आप लॉगिन शेल नहीं चला रहे हैं।

बैश को कैसे पढ़ा जाता है (या नहीं पढ़ता है) विभिन्न कॉन्फ़िगरेशन फ़ाइलों पर बैश मैनुअल के आह्वान अनुभाग को पढ़ें।

इससे अंश man bash:

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

suदूसरी ओर भी डिफ़ॉल्ट रूप से एक लॉगिन शेल शुरू नहीं करता है, आपको --loginविकल्प का उपयोग करके ऐसा करने के लिए कहना होगा ।


9
शॉट login_shell कमांड के लिए बहुत बहुत धन्यवाद । बहुत बढ़िया!!
विरियाटो

27

मुझे लगता है कि यह ध्यान देने योग्य है कि आप प्रोफ़ाइल वरीयताओं को संपादित करके एक लॉगिन शेल (यानी बैश-एल) का उपयोग करने के लिए गनोम-टर्मिनल का डिफ़ॉल्ट बदल सकते हैं।

Edit -> Profile Preferences -> शीर्षक और कमांड टैब पर जाएं "रन कमांड को एक लॉगिन शेल के रूप में चेक करें" विकल्प


1
इस सेटिंग को सक्षम करने के लिए डाउनसाइड क्या हैं?
संजोएं

2
@chris आप बहुत अधिक अवसर में कोड को आवश्यकता से थोड़ा अधिक कोड लोड कर रहे हैं। यह शायद कोई फर्क नहीं पड़ता कि आपका ~/.bash_profileमूल्यांकन वास्तव में जल्दी से हो रहा है, जो कि शायद मामला है। चेक करने के लिए एक अच्छी बात यह है कि किसी भी कॉल का अन्य प्रक्रियाओं के लिए पीछा करना जो आमतौर पर काफी महंगी होती हैं।
vabab

14

यदि आप एक टर्मिनल खोलते हैं या suशेल चलाते हैं तो लॉगिन शेल के रूप में नहीं बल्कि सामान्य इंटरेक्टिव शेल के रूप में निष्पादित किया जाता है। तो यह पढ़ता है ~/.bashrcलेकिन नहीं ~/.bash_profile। आप इसे अपने शेल को लॉगिन शेल के रूप में चलाने suके -lविकल्प के साथ चला सकते हैं ।

जब आप GUI के साथ काम कर रहे होते हैं, तो शेल आमतौर पर एक लॉगिन शेल के रूप में कभी नहीं चलाया जाता है, इसलिए आमतौर पर सभी yout सामान को अंदर रखना ठीक होता है ~/.bashrc


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

4

टी एल; डॉ

शास्त्रीय अनुशंसित उबंटू सेटअप में, ~/.bash_profileकेवल विशिष्ट अवसरों में मूल्यांकन किया जाता है। और यह समझ में आता है।

अपना सामान अंदर रखो ~/.bashrc, यह हर बार मूल्यांकन किया जाएगा।

ठीक है, मैं समझना चाहता हूं, यह समझ में क्यों आता है?

समझने के लिए कि क्या चल रहा है:

  • लिनक्स पर सभी प्रक्रियाओं में पर्यावरण चर होते हैं और उनका उपयोग किया जाता है
  • पर्यावरण चर विरासत में मिले हैं
  • इस प्रकार आपकी सभी प्रक्रिया के पिता पर एक बार उन्हें स्थापित करना पर्याप्त है (विशेषकर यदि इसके लिए कुछ गणना समय की आवश्यकता है।)
  • आपके डिवाइस पर लॉग इन करने के बाद आपकी सभी प्रक्रिया के पिता को आमतौर पर लॉन्च किया जाता है (अपनी साख दें)।
  • ऐसी चीजें हैं जिन्हें आप केवल एक बार करना चाहते हैं जब आप अपने कंप्यूटर पर लॉग इन करते हैं (उदाहरण के लिए नए मेल की जांच करें ...)।

तो "लॉगिन" समय आमतौर पर है:

  • कंसोल मोड में, जब आप लॉगिन करते हैं (Ctrl-Alt F1 के साथ) या इसके माध्यम से ssh, जैसे शेल सभी प्रक्रिया का पिता होगा, यह आपके लोड करेगा ~/.bash_profile
  • ग्राफिक मोड में, जब आप अपना सत्र खोलते हैं, तो पहली प्रक्रिया ( gnome-sessionशास्त्रीय ubuntu के लिए) पढ़ने के लिए प्रभारी होगी
    .profile

ठीक है, तो मेरा सामान कहां रखा जाए?

यह बल्कि जटिल है, पूरी कहानी यहां है । लेकिन यहाँ एक रन डाउन है जो ubuntu यूजर्स के लिए काफी सामान्य है। तो यह देखते हुए कि:

  • आप bashशेल का उपयोग करें ,
  • आपके पास अपने लोडिंग को जोड़ने के ~/.bash_profileलिए सिफारिश का पालन करना है ताकि कम से कम एक फ़ाइल प्राप्त हो सके, जो कि मूल्यांकन किए गए मैकैनिज़्म है~/.bashrc~/.bash_profile

यह एक त्वरित सुझाव है कि चीजों को कहां रखा जाए।

  • ~ / .bashrc ( सभी अवसरों में मूल्यांकन किया जाता है , बशर्ते आप अनुशंसा का पालन करें)

    अपने उपयोगकर्ता-केवल और बैश-केवल कमांड-लाइन उपयोग (उदाहरण के लिए उपनाम) के लिए फास्ट-मूल्यांकन पर्यावरण चर और कोड । bashism का स्वागत है।

    यह खुद पर लोड हो जाता है:

    • चित्रमय सत्रों में एक नई शेल विंडो / फलक बनाएं।
    • बुला bash
    • screenनया फलक या टैब। (नहीं tmux!)
    • ग्राफिकल कंसोल क्लाइंट ( terminator/ gnome-terminal...) में कोई भी बैश उदाहरण यदि आप "लॉगिन शेल के रूप में रन कमांड" विकल्प पर टिक नहीं करते हैं

    और यह सभी अन्य अवसरों में पूर्व की सिफारिश के लिए धन्यवाद लोड हो जाएगा।

  • ~ / .bash_profile ( केवल विशिष्ट अवसर में मूल्यांकन किया जाता है )

    अपने उपयोगकर्ता-केवल और कंसोल-सत्र प्रक्रियाओं के लिए धीमी-मूल्यांकन पर्यावरण चर और कोड । bashism का स्वागत है। इस पर लोड हो जाता है:

    • कंसोल लॉगिन (Ctrl-Alt F1),
    • ssh इस मशीन को लॉगिन करता है,
    • tmuxनया फलक या विंडोज़ (डिफ़ॉल्ट सेटिंग्स), (नहीं screen!)
    • का स्पष्ट कॉल bash -l,
    • ग्राफ़िकल कंसोल क्लाइंट ( terminator/ gnome-terminal...) में कोई भी बैश उदाहरण केवल तभी जब आप "रन कमांड को लॉग शेल के रूप में विकल्प" पर टिक करते हैं।
  • ~ / .प्रोफाइल (केवल ग्राफिकल-सेशन में मूल्यांकन किया जाता है)

    के लिए धीमी गति से मूल्यांकन वातावरण चर और साथ कोई bashism अपने लिए -केवल उपयोगकर्ता और सभी चित्रमय सत्र प्रक्रियाओं। यह आपके चित्रमय UI में लॉगिन पर लोड हो जाता है।


अवसरों कि पार्टी की योजना बनाई एक प्रोफ़ाइल फ़ाइल को लोड करता है, यह लोड होगा .profileयदि .bash_profileमौजूद नहीं है।
मुरु

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