macos - ओएस एक्स में पर्यावरण चर सेट करना?




bash path (20)

एक ही स्रोत से कमांड लाइन और जीयूआई ऐप्स दोनों के लिए समाधान (योसाइट और एल कैपिटन के साथ काम करता है)

आइए मान लें कि आपके पास ~/.bash_profile में पर्यावरण परिवर्तनीय परिभाषाएं हैं जैसे निम्न स्निपेट में:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

हमें एक लॉन्च एजेंट की आवश्यकता है जो प्रत्येक लॉगिन पर और कभी भी मांग पर चलती है जो उपयोगकर्ता चर में इन चरों को लोड करने जा रही है। इन परिभाषाओं को पार्स करने और एजेंट द्वारा निष्पादित किए जाने वाले आवश्यक आदेशों को बनाने के लिए हमें एक शेल स्क्रिप्ट की भी आवश्यकता होगी।

निम्नलिखित सामग्री के साथ ~/Library/LaunchAgents/ निर्देशिका में ~/Library/LaunchAgents/ प्रत्यय (जैसे osx-env-sync.plist ) के साथ एक फ़ाइल बनाएँ:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-l पैरामीटर यहां महत्वपूर्ण है; शेल स्क्रिप्ट को लॉगिन शेल के साथ निष्पादित करने के लिए जरूरी है ताकि इस स्क्रिप्ट को निष्पादित करने से पहले ~/.bash_profile को पहले स्थान पर सोर्स किया जा सके।

अब, खोल स्क्रिप्ट। इसे निम्नलिखित सामग्री के साथ ~/.osx-env-sync.sh पर बनाएं:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

सुनिश्चित करें कि खोल स्क्रिप्ट निष्पादन योग्य है:

chmod +x ~/.osx-env-sync.sh

अब, वर्तमान सत्र के लिए लॉन्च एजेंट लोड करें:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(पुन) एक जीयूआई आवेदन लॉन्च करें और सत्यापित करें कि यह पर्यावरण चर को पढ़ सकता है।

सेटअप लगातार है। यह restartts और relogins जीवित रहेगा।

शुरुआती सेटअप (जो आपने अभी किया है) के बाद, यदि आप अपने पूरे वातावरण में अपने ~/.bash_profile में किसी भी बदलाव को फिर से दिखाना चाहते हैं, तो launchctl load ... को पुन: launchctl load ... कमांड जो आप चाहते हैं वह नहीं करेगा; इसके बजाय आपको निम्न की तरह एक चेतावनी मिलेगी:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

लॉगआउट / लॉगिन प्रक्रिया के बिना अपने पर्यावरण चर को फिर से लोड करने के लिए निम्न कार्य करें:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

अंत में सुनिश्चित करें कि आप परिवर्तनों के बारे में जागरूक करने के लिए अपने पहले से चल रहे एप्लिकेशन (टर्मिनल.एप सहित) को फिर से लॉन्च करें।

मैंने यहां गिटहब प्रोजेक्ट में कोड और स्पष्टीकरण भी धक्का दिया है: osx-env-sync

मुझे आशा है कि यह कम से कम ओएस एक्स (योसमेट और एल कैपिटन) के नवीनतम संस्करणों के लिए अंतिम समाधान होगा।

ओएसएक्स में पाथ जैसे पर्यावरण चर को संशोधित करने का सही तरीका क्या है? मैंने Google को थोड़ा सा देखा है और संपादित करने के लिए 3 अलग-अलग फाइलें पाई हैं:

  • / Etc / पथ
  • ~ / .profile
  • ~ / .tcshrc

मेरे पास इनमें से कुछ फ़ाइलें भी नहीं हैं, और मुझे पूरा यकीन है कि .tcshrc गलत है, क्योंकि ओएसएक्स अब बैश का उपयोग करता है। किसी को भी कोई विचार है कि इन चर, विशेष रूप से पथ, परिभाषित किया गया है?

संपादित करें: मैं ओएस एक्स 10.5 चला रहा हूँ


स्पॉटलाइट द्वारा शुरू की गई नई प्रक्रियाओं के लिए पर्यावरण को कैसे सेट करें (रीबूट करने की आवश्यकता के बिना)

आप launchctl setenv साथ लॉन्च (और विस्तार से, स्पॉटलाइट से शुरू कुछ भी) द्वारा उपयोग किए गए पर्यावरण को सेट कर सकते हैं। उदाहरण के लिए पथ सेट करने के लिए:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

या यदि आप अपना पथ .bashrc या इसी तरह से सेट करना चाहते हैं, तो इसे लॉन्च में प्रतिबिंबित करें:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

रीबूट करने की कोई आवश्यकता नहीं है, हालांकि यदि आप इसे बदलते परिवेश को चुनना चाहते हैं तो आपको ऐप को पुनरारंभ करने की आवश्यकता होगी।

इसमें टर्मिनल.एप के तहत पहले से चल रहे किसी भी गोले शामिल हैं, हालांकि यदि आप वहां हैं तो आप पर्यावरण को अधिक सीधे सेट कर सकते हैं, उदाहरण के लिए export PATH=/opt/local/bin:/opt/local/sbin:$PATH bash या zsh के लिए export PATH=/opt/local/bin:/opt/local/sbin:$PATH

रीबूट के बाद परिवर्तन कैसे रखें

रीबूट के बाद परिवर्तनों को रखने के लिए आप /etc/launchd.conf से पर्यावरण चर सेट कर सकते हैं, जैसे:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

जब आप रीबूट करते हैं तो launchd.conf स्वचालित रूप से निष्पादित होता है।

यदि आप इन परिवर्तनों को अभी प्रभावी करना चाहते हैं, तो आपको launchctl.conf को पुन: प्रसंस्करण करने के लिए इस आदेश का उपयोग करना चाहिए (धन्यवाद @ टिप के लिए mmlement!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

आप launchd.conf बारे में अधिक जानकारी प्राप्त कर सकते हैं और यह launchd.conf को कमांड man launchctl launchd.conf साथ कैसे लोड करता है।


Setup your PATH environment variable on Mac OS

Open the Terminal program (this is in your Applications/Utilites folder by default). Run the following command touch ~/.bash_profile; open ~/.bash_profile This will open the file in the your default text editor.

For ANDROID SDK as example :

You need to add the path to your Android SDK platform-tools and tools directory. In my example I will use "/Development/android-sdk-macosx" as the directory the SDK is installed in. Add the following line:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Save the file and quit the text editor. Execute your .bash_profile to update your PATH.

source ~/.bash_profile

Now everytime you open the Terminal program you PATH will included the Android SDK.


अपडेट (2017-08-04)

ऐसा लगता है कि (कम से कम) मैकोज़ 10.12.6 (सिएरा) इस विधि ने अपाचे httpd ( system और launchctl config के user विकल्प दोनों के लिए) के लिए काम करना बंद कर दिया है। अन्य कार्यक्रम प्रभावित नहीं होते हैं। यह कल्पना की जा सकती है कि यह httpd में एक बग है।

मूल उत्तर

यह ओएस एक्स 10.10+ से संबंधित है (10.11+ विशेष रूप से रूटलेस मोड के कारण जहां /usr/bin अब लिखने योग्य नहीं है)।

मैंने एकाधिक स्थानों में पढ़ा है कि PATH वैरिएबल सेट करने के लिए launchctl setenv PATH <new path> ओएस एक्स में एक बग के कारण काम नहीं करता है (जो व्यक्तिगत अनुभव से सच लगता है)। मैंने पाया कि शैल से लॉन्च नहीं किए गए अनुप्रयोगों के लिए PATH सेट किया जा सकता है:

sudo launchctl config user path <new path>

यह विकल्प लॉन्चक्टल मैन पेज में प्रलेखित है:

विन्यास प्रणाली | उपयोगकर्ता पैरामीटर मान

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

[...]

पथ

स्ट्रिंग मान में लक्ष्य डोमेन के भीतर सभी सेवाओं के लिए पाथ पर्यावरण चर सेट करता है। स्ट्रिंग मान पर्यावरण (7) में पाथ पर्यावरण चर के लिए उल्लिखित स्वरूप के अनुरूप होना चाहिए। ध्यान दें कि यदि कोई सेवा अपने स्वयं के पथ निर्दिष्ट करती है, तो सेवा-विशिष्ट पर्यावरण परिवर्तक को प्राथमिकता दी जाएगी।

नोट: इस सुविधा का उपयोग डोमेन के भीतर सभी सेवाओं के लिए सामान्य पर्यावरण चर सेट करने के लिए नहीं किया जा सकता है। यह जानबूझकर पाथ पर्यावरण विविधता के लिए प्रेरित है और सुरक्षा कारणों से कुछ और नहीं है।

मैंने फाइंडर से शुरू किए गए जीयूआई एप्लिकेशन के साथ काम करने की पुष्टि की है (जो पाथ प्राप्त करने के लिए getenv का उपयोग करता है)। ध्यान दें कि आपको केवल एक बार ऐसा करना है और परिवर्तन रीबूट के माध्यम से लगातार होगा।


उत्तर मैट कर्टिस ने जवाब दिया, मैंने लॉन्चक्टल के माध्यम से पर्यावरण चर सेट किया है, लेकिन मैं इसे निर्यात नामक फ़ंक्शन में लपेटता हूं, ताकि जब भी मैं अपने .bash_profile में सामान्य की तरह एक चर निर्यात करता हूं, तो यह लॉन्चक्टल द्वारा भी सेट किया जाता है। ये है जो मैं करता हूं:

  1. मेरा .bash_profile पूरी तरह से एक पंक्ति के होते हैं, (यह सिर्फ व्यक्तिगत वरीयता है।)

    source .bashrc
    
  2. मेरा .bashrc यह है:

    function export()
    {
        builtin export "[email protected]"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${[email protected]}"
        fi
    }
    
    export -f export
    
  3. उपरोक्त बैश बिल्टिन "निर्यात" को अधिभारित करेगा और सामान्य रूप से सबकुछ निर्यात करेगा (आप देखेंगे कि मैं इसके साथ "निर्यात" निर्यात करता हूं!), फिर उन्हें लॉन्चक्टल के माध्यम से ओएस एक्स ऐप वातावरण के लिए ठीक से सेट करें, चाहे आप निम्न में से किसी एक का उपयोग करें:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
    
  4. इस तरह मुझे हर चर को हर बार लॉन्चक्टल में भेजने की ज़रूरत नहीं है, और मैं बस अपना .bash_profile / .bashrc जिस तरह से चाहता हूं उसे स्थापित कर सकता हूं। टर्मिनल विंडो खोलें, launchctl getenv myVar साथ अपनी रुचि रखने वाले अपने पर्यावरण चर को देखें, अपने .bash_profile / .bashrc में कुछ बदलें, टर्मिनल विंडो बंद करें और इसे फिर से खोलें, फिर से वैरिएबल को लॉन्चक्टल के साथ जांचें, और voilá, यह बदल गया है

  5. फिर, माउंटेन शेर की दुनिया के लिए अन्य समाधानों की तरह, ऐप्स के लिए उपलब्ध किसी भी नए पर्यावरण चर के लिए, आपको परिवर्तन के बाद उन्हें लॉन्च या फिर से लॉन्च करने की आवश्यकता है।


एक और, मुफ़्त, ओपनसोर्स, मैक ओएसएक्स माउंटेन शेर (10.8) वरीयता फलक / पर्यावरण। EnvPane समाधान EnvPane

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

डेवलपर द्वारा बताए गए अनुसार:

एन्पेन मैक ओएस एक्स 10.8 (माउंटेन शेर) के लिए एक वरीयता फलक है जो आपको ग्राफिकल और टर्मिनल सत्रों में सभी प्रोग्रामों के लिए पर्यावरण चर सेट करने देता है। माउंटेन शेर में ~ / .MacOSX / environment.plist के लिए यह केवल समर्थन बहाल नहीं करता है, यह लॉग इन करने और वापस आने की आवश्यकता के बिना तुरंत आपके पर्यावरण को भी प्रकाशित करता है।
<कटाव>
एन्वापेन में एक लॉन्च एजेंट होता है (और स्वचालित रूप से इंस्टॉल करता है) जो 1) लॉगिन के तुरंत बाद और 2) जब भी ~ / .MACOSX / environment.plist बदलता है। एजेंट ~ / .MACOSX / environment.plist पढ़ता है और उस फ़ाइल से पर्यावरण चर को वर्तमान उपयोगकर्ता के लॉन्च किए गए इंस्टेंस में उसी एपीआई के माध्यम से निर्यात करता है जिसका उपयोग लॉन्चक्टल सेटेंव और लॉन्चक्टल unsetenv द्वारा किया जाता है।

अस्वीकरण: मैं डेवलपर या उसकी परियोजना से संबंधित नहीं हूं।

पीएस मुझे नाम पसंद है (जैसे 'एंड्स पेन' लगता है)।


कभी-कभी पिछले सभी उत्तर बस काम नहीं करते हैं। यदि आप ग्रहण में या इंटेलिजे में एक सिस्टम वैरिएबल (जैसे M2_HOME) तक पहुंच प्राप्त करना चाहते हैं तो केवल इस मामले में मेरे लिए काम करने वाली एकमात्र चीज है:

पहले (चरण 1) संपादित करें /etc/launchd.conf को इस तरह की एक पंक्ति रखने के लिए संपादित करें: "setenv VAR मान" और फिर (चरण 2) रीबूट करें।

बस संशोधित .bash_profile काम नहीं करेगा क्योंकि ओएसएक्स में अनुप्रयोगों को अन्य यूनिक्स के रूप में शुरू नहीं किया गया है, वे माता-पिता खोल चर के उत्तराधिकारी नहीं हैं। अन्य सभी संशोधन ऐसे कारण के लिए काम नहीं करेंगे जो मेरे लिए अज्ञात है। शायद कोई और इसके बारे में स्पष्टीकरण दे सकता है।


बैश स्टार्टअप फ़ाइलों में से कोई भी - ~/.bashrc , ~/.bash_profile , ~/.profile । GUI अनुप्रयोगों में पर्यावरण चर के लिए ~/.MacOSX/environment.plist नाम की कुछ प्रकार की अजीब फ़ाइल भी है।


माउंटेन शेर पर सभी /etc/paths और /etc/launchd.conf संपादन कोई प्रभाव नहीं लेता है!

ऐप्पल के डेवलपर मंच कहते हैं:

"अपने इच्छित पर्यावरण चर के साथ" LSEnvironment "शब्दकोश रखने के लिए .app के Info.plist को स्वयं बदलें।

~ / .MacOSX / environment.plist अब समर्थित नहीं है। "

तो मैंने सीधे ऐप की Info.plist संपादित किया ("AppName.app" पर राइट क्लिक करें (इस मामले में SourceTree) और फिर " Show package contents ")

और एक नई कुंजी / निर्देश जोड़ी कहा जाता है:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/[email protected]/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(देखें: लॉन्च सर्विसेज ऐप्पल पर दस्तावेज़ीकरण )

अब ऐप (मेरे मामले में SourceTree) दिए गए पथ का उपयोग करता है और गिट 1.9.3 :-) के साथ काम करता है

पीएस: बेशक आपको अपनी विशिष्ट पथ आवश्यकताओं में पथ प्रविष्टि को समायोजित करना होगा।


यह आसान है:

Edit ~/.profile and put your variables as follow

$ vim ~/.profile

In file put:

MY_ENV_VAR=value

  1. Save ( :wq )

  2. Restart the terminal (Quit and open it again)

  3. Make sure that`s all be fine:

$ echo $MY_ENV_VAR

$ value


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

मेरे सिस्टम पर (मैक ओएस एक्स 10.6.8) ऐसा प्रतीत होता है कि पर्यावरण में परिभाषित चर .plist को स्पॉटलाइट (लॉन्च के माध्यम से) से लॉन्च किए गए ऐप्स पर विश्वसनीय रूप से निर्यात किया जा रहा है। मेरी परेशानी यह है कि उन युद्धों को टर्मिनल में नए बैश सत्रों में निर्यात नहीं किया जा रहा है। मैं यहाँ विपरीत चित्र के रूप में विपरीत समस्या है।

नोट: पर्यावरण। प्लिस्ट जेएसओएन की तरह दिखता है, एक्सएमएल नहीं, जैसा कि पहले वर्णित है

मैं स्पॉटलाइट ऐप्स को ~ / MacOSX / environment.plist संपादित करके वर्र्स देखने में सक्षम था और मैं अपने .profile फ़ाइल में निम्नलिखित जोड़कर एक ही टर्म को एक टर्मिनल सत्र में मजबूर करने में सक्षम था:

eval $(launchctl export)

शेर तक (10.7) तक और आप उन्हें सेट कर सकते हैं

~ / .MacOSX / environment.plist

देख:

टर्मिनल में पथ के लिए, आपको .bash_profile या .profile में सेट करने में सक्षम होना चाहिए (आपको शायद इसे बनाना होगा)

माउंटेन शेर के लिए और उससे परे आपको launchd और launchctl का उपयोग करने की आवश्यकता है


For Bash, try adding your environment variables to the file /etc/profile to make them available for all users. No need to reboot, just start a new Terminal session.


Here is a very simple way to do what you want. In my case, it was getting gradle to work (for Android Studio )

  • Open up Terminal.
  • Run the following command:

    sudo nano /etc/paths or sudo vim /etc/paths

  • Enter your password, when prompted.

  • Go to the bottom of the file, and enter the path you wish to add.
  • Hit control-x to quit.
  • Enter 'Y' to save the modified buffer.
  • Open a new terminal window then type:

    echo $PATH

You should see the new path appended to the end of the PATH

I got these details from this post:

http://architectryan.com/2012/10/02/add-to-the-path-on-mac-os-x-mountain-lion/#.UkED3rxPp3Q

I hope that can help someone else


It's quite simple, edit .profile (vi, nano, sublimeText or other text editor) file, you can found it at ~/ directory (user directory) and set like this :

export MY_VAR=[your value here]

exemple with java home :

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

save it and return to the terminal.

You can reload it with :

source .profile or close / open your terminal window.


Just did this really easy and quick. First create a ~/.bash_profile from terminal:

touch .bash_profile

फिर

open -a TextEdit.app .bash_profile

जोड़ना

export TOMCAT_HOME=/Library/Tomcat/Home

save documement and you are done.


There are two type of shells at play here.

  • Non-Login: .bashrc is reloaded every time you start a new copy of bash
  • Login: The .profile is loaded only when you either login, or explicitly tell bash to load it and use it as a login shell.

Its important to understand here that with bash .bashrc is only read by a shell that's both interactive and non-login, and you will find that people often load .bashrc in .bash_profile to overcome this limitation.

Now that you have the basic understanding, lets move on to how i would advice you to set it up.

  • .profile: create it non-existing. Put your PATH setup in there.
  • .bashrc: create if non-existing. Put all your Aliases and Custom method in there.
  • .bash_profile: create if non-existing. Put the following in there.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

To be concise and clear about what each file is intended for

  • ~/.profile is sourced every time Terminal.app is launched
  • ~/.bashrc is where "traditionally" all the export statements for Bash environment are set
  • /etc/paths is the main file in Mac OS that contains the list of default paths for building the PATH environment variable for all users
  • /etc/paths.d/ contains files that hold additional search paths

Non-terminal programs don't inherit the system wide PATH and MANPATH variables that your terminal does! To set environment for all processes launched by a specific user, thus making environment variables available to Mac OS X GUI applications, those variables must be defined in your ~/.MacOSX/environment.plist (Apple Technical Q&A QA1067)

Use the following command line to synchronize your environment.plist with /etc/paths :

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"


well, I'm unsure about /etc/paths and ~/.MacOSX/environment.plist those are new.

But with bash, you should know that .bashrc is executed with every new shell invocation and .bash_profile is only executed once at startup. Don't know how often this is with macos, I think the distinction has broken down with the window system launching everything.

Personally, I eliminate the confusion by creating a .bashrc with everything I need and then do:

ln -s .bashrc .bash_profile




environment-variables