मेरा ~ / .bash_profile काम क्यों नहीं करता है?


35

मैं लिनक्स मिंट का उपयोग कर रहा हूं। मेरा लॉगिन शेल ( cat /etc/passwd | grep myUserName) बैश है।

जब मैं अपना ग्राफिकल डेस्कटॉप वातावरण शुरू करता हूं और उससे एक टर्मिनल एमुलेटर चलाता हूं, तो मैं देख सकता हूं कि .bash_profileयह खट्टा नहीं है (पर्यावरण exportसंस्करण जो इसमें एड हैं, परेशान हैं)। लेकिन अगर मैं एक पाठ कंसोल ( ctrl+ alt+ F1) से लॉग इन करता हूं या मैन्युअल रूप bash -lसे टर्मिनल एमुलेटर से चलाता हूं , तो .bash_profileठीक काम करता है।

क्या मैं गलत हूं जब मुझे लगता है कि .bash_profileएक्स शुरू exportहोने पर खट्टा होना चाहिए और एक्स से चलने वाले टर्मिनल में सभी एड संस्करण उपलब्ध होने चाहिए?

पुनश्च सब कुछ अंदर रखने .bashrcऔर इससे सोर्सिंग करना .bash_profileअच्छा विचार नहीं है ( https://stackoverflow.com/questions/902946/ ): पर्यावरण का सामान केवल एक बार ही खट्टा होना चाहिए।

जवाबों:


39

फ़ाइल ~/.bash_profileको bash द्वारा पढ़ा जाता है जब यह एक लॉगिन शेल होता है। पाठ मोड में लॉग इन करने पर आपको यही मिलता है।

जब आप X के तहत लॉग इन करते हैं, तो स्टार्टअप स्क्रिप्ट निष्पादित होती है /bin/sh। Ubuntu और टकसाल पर, /bin/shहै पानी का छींटा , नहीं बैश। डैश और बैश दोनों की मुख्य विशेषताएं समान हैं, लेकिन डैश तेज़ और छोटे होने के लिए इन मुख्य विशेषताओं से चिपके रहते हैं, जबकि बैश अधिक संसाधनों की आवश्यकता होने पर बहुत सी सुविधाएँ जोड़ता है। स्क्रिप्ट के लिए डैश का उपयोग करना आम है, जिसमें अतिरिक्त सुविधाओं की आवश्यकता नहीं होती है और इंटरैक्टिव उपयोग के लिए बैश की आवश्यकता होती है (हालांकि zsh में बहुत सारे अच्छे फीचर हैं )।

प्रदर्शन प्रबंधक के अधिकांश संयोजन (कार्यक्रम है जहाँ आप अपने उपयोगकर्ता नाम और पासवर्ड टाइप करें) और डेस्कटॉप वातावरण को पढ़ने ~/.profileमें लॉगिन स्क्रिप्ट से /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionया जो भी लागू हो। तो अपने पर्यावरण चर परिभाषाओं में डाल दिया ~/.profile। डैश का समर्थन करने वाले केवल सिंटैक्स का उपयोग करना सुनिश्चित करें।

तो आपको कहाँ रखना चाहिए?

  • एक अच्छा .bash_profileलोड .profile, और लोड .bashrcअगर खोल इंटरैक्टिव है।

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • में .profile, डाल वातावरण चर परिभाषाएँ, और इस तरह के रूप में अन्य सत्र सेटिंग ulimit

  • में .bashrc, इस तरह के उपनाम, काम करता है, पूरा होने, कुंजी बाइंडिंग (कि में नहीं हैं के रूप में डाल दिया बैश इंटरैक्टिव सेटिंग .inputrc), ...

लॉगिन शेल और नॉन-लॉगिन शेल के बीच अंतर भी देखें ? और .bashrc के लिए वैकल्पिक है


1
एकल उत्तर से सीखी गई कई बातें :)
mtk

16

.bash_profileबैश का स्टार्टअप कॉन्फ़िगरेशन स्क्रिप्ट है। स्रोत के लिए कोई मानक अनिवार्य X मौजूद नहीं है .bash_profile

आप जो सोच रहे हैं वह बल्कि है .profile। मूल रूप से यह बॉर्न शेल (श) की स्टार्टअप कॉन्फ़िगरेशन फ़ाइल थी। आज कई वितरणों में अपने डेस्कटॉप वातावरण को स्रोत पर सेट किया गया है .profile। ध्यान दें कि यह भी एक मानक नहीं है, लेकिन यह एक सम्मेलन लगता है।

डेबियन .profileआलेखीय लॉगिन ( 2013 के रूप में विकी पृष्ठ ) पर स्रोत करते थे अब यह ( 2016 के रूप में विकि पृष्ठ ) नहीं है।

.xprofileचित्रमय लॉगिन पर आर्क स्रोत ( 2013 के रूप में विकी पृष्ठ )।

उबंटू .profile( 2013 के रूप में विकी पेज ) का उपयोग करने के लिए हतोत्साहित करता था अब यह और नहीं हतोत्साहित करता है ( 2016 के रूप में विकी पृष्ठ )।


आपके अन्य प्रश्न के बारे में: मेरा ~ / .bash_profile काम क्यों नहीं करता है? वह अपेक्षित व्यवहार है।

व्यवहार, संक्षेप में, इस प्रकार है:

  • बैश एक इंटरैक्टिव लॉगिन शेल के रूप में शुरू हुआ: पढ़ता है ~/.profile
  • बैश एक इंटरैक्टिव गैर-लॉगिन शेल के रूप में शुरू हुआ: पढ़ता है ~/.bashrc

अधिक जानकारी के लिए, आस्कबंटू में एक समान प्रश्न के लिए मेरा उत्तर देखें: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132,319 # 132,319


1
इसमें से कुछ सही है, लेकिन "हमेशा पढ़ा ~/.bashrc" बुरी सलाह है: आपको केवल .bashrcएक इंटरैक्टिव शेल से पढ़ना चाहिए । आपने यहां मुख्य समस्या को याद किया है, जो यह है कि जब X के तहत लॉग इन किया जाता है, तो कोई लॉगिन उदाहरण नहीं है (ज्यादातर प्रदर्शन प्रबंधक / डेस्कटॉप पर्यावरण संयोजनों सहित, स्पष्ट रूप से एंटोनियो के)।
गिलेस एसओ- बुराई को रोकना '

आपकी प्रतिक्रिया के लिए आपका धन्यवाद। मुझे उम्मीद है कि मैंने आपकी शिकायतों को हल करने के लिए अपने जवाब को अच्छी तरह से अपडेट किया। "हमेशा पढ़ने .bashrc" की मेरी सलाह के बारे में , मेरा मतलब हमेशा एक इंटरैक्टिव शेल के लिए था। मैंने उस हिस्से को स्पष्ट कर दिया है। मुझे उम्मीद है कि अब यह भ्रामक नहीं है।
lesmana

2
" उबंटू विशेष रूप से .profile( लिंक ) का उपयोग करके हतोत्साहित करता है " विकी ने एक बार (बेतुका) किया कि हतोत्साहित करें; यह तय हो गया है। (नोट /etc/profileलिपियों को जोड़ने के लिए प्राथमिकता में, सिस्टमबद्ध असाइनमेंट के लिए हतोत्साहित किया जाता है /etc/profile.d।) प्रति-उपयोगकर्ता .profileफ़ाइलों को अब प्रति-उपयोगकर्ता पर्यावरण चर सेट करने के लिए अनुशंसित तरीकों में से एक के रूप में प्रस्तुत किया जाता है: "पर्यावरण चर सेटिंग्स के लिए उपयुक्त फाइलें जो बस एक को प्रभावित करना चाहिए। विशेष उपयोगकर्ता (एक पूरे के रूप में सिस्टम के बजाय) ~ / .pam_environment और ~ / .profile हैं । "
एलियाह कगन

डेबियन के बारे में जुड़ा पृष्ठ निर्दिष्ट करता है कि डेबियन ग्राफिकल लॉगिन के लिए नहीं पढ़ता है ~/.profileऔर ~/.xsessionrcइसके बजाय इसका उपयोग किया जाना चाहिए।
करोरा

ध्यान देने के लिए धन्यवाद। विकी पेज अपडेट हो गया। मैं संस्करणों के साथ जुड़ा हुआ था क्योंकि वे उत्तर के समय थे।
लेसमाना

2

अपने प्रश्न में, आप https://stackoverflow.com/questions/902946/ के रूप में संदर्भित करते हैं कि स्रोत की सिफारिश नहीं की जाती है, जब स्वीकृत उत्तर निर्धारित होता है

  • मेरे PATH सेटअप को एक .profile फ़ाइल में रखें (क्योंकि मैं कभी-कभी अन्य गोले का उपयोग करता हूं)
  • मेरे बैश उपनाम और कार्यों को मेरी .bashrc फ़ाइल में डालें
  • फिर इस [EDITED: स्निप कोड-कमेंट्स] का उपयोग करें:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

यह सब डाल .profileमेरे लिए लिनक्स मिंट पर काम नहीं किया। .bashrcकाम करना ठीक है।


2

समस्याओं का एक जोड़ा उठता है जब / स्रोत को पुनः लोड करने की कोशिश कर रहा है / / .profile फ़ाइल। [यह उबंटू लिनक्स को संदर्भित करता है - कुछ मामलों में आदेशों का विवरण अलग होगा]

  1. क्या आप इसे सीधे टर्मिनल या स्क्रिप्ट में चला रहे हैं?
  2. आप इसे एक स्क्रिप्ट में कैसे चलाते हैं?

विज्ञापन। 1)

इसे सीधे टर्मिनल में चलाने का मतलब है कि कोई उप-आधार नहीं बनाया जाएगा। तो आप दो कमांड का उपयोग कर सकते हैं:

source ~/.bash_profile

या

. ~/.bash_profile

दोनों ही मामलों में यह .profile फ़ाइल की सामग्री के साथ पर्यावरण को अद्यतन करेगा।

Ad 2) आप कॉल करके या तो किसी भी bash स्क्रिप्ट को शुरू कर सकते हैं

sh myscript.sh 

या

. myscript.sh

पहले मामले में यह एक सबस्क्रिप्शन बनाएगा जो आपके सिस्टम के पर्यावरण चर को प्रभावित नहीं करेगा और वे केवल सब-प्रोसेस प्रक्रिया के लिए दिखाई देंगे। सदस्यता आदेश समाप्त करने के बाद निर्यात आदि में से कोई भी लागू नहीं किया जाएगा। यह एक इतिहास है और समय की एक बहुत कुछ करने के लिए विकासकर्ताओं की एक बहुत कुछ है।

वैश्विक वातावरण के लिए आपके स्क्रिप्ट में लागू होने वाले आपके परिवर्तनों के लिए स्क्रिप्ट के साथ चलना होगा

.myscript.sh

आदेश।

यह सुनिश्चित करने के लिए कि आप स्क्रिप्ट उप-भाग में नहीं चल रहे हैं आप इस फ़ंक्शन का उपयोग कर सकते हैं। (फिर से उदाहरण उबंटू खोल के लिए है)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

मुझे आशा है कि यह कुछ सामान्य गलतफहमियों को दूर करता है! : डी गुड लक!


0

टर्मिनल को लॉगिन टर्मिनल बनाने का सरल उपाय है। डिफ़ॉल्ट प्रोफ़ाइल के 'टाइल और कमांड' के तहत गनोम टर्मिनल के लिए आप बॉक्स "रन कमांड को एक लॉगिन शेल के रूप में देख सकते हैं"। यह आलेख एक लॉगिन शेल और एक के बीच का अंतर बताता है जो नहीं है।

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