मैक ओएस एक्स में पर्यावरण चर


186

अद्यतन: नीचे दिए गए लिंक का पूर्ण उत्तर नहीं है । पथ या चर को दो स्थानों पर सेट करना (GUI के लिए और शेल के लिए एक) लंगड़ा है।

डुप्लिकेट नहीं : OS X में वातावरण चर सेट करना?


विंडोज पृष्ठभूमि से आ रहा है, जहां पर्यावरण चर सेट करना और संशोधित करना बहुत आसान है (बस सिस्टम गुण> उन्नत> पर्यावरण चर पर जाएं), यह प्रतीत नहीं होता है कि मैक ओएस 10.5 पर सीधे आगे। अधिकांश संदर्भ कहते हैं कि मुझे अपडेट करना चाहिए / etc / प्रोफाइल या ~ / .profile। क्या वे सिस्टम वेरिएबल्स और यूजर वेरिएबल्स के समकक्ष हैं? उदाहरण के लिए, मुझे अपना JAVA_HOMEचर कहां सेट करना चाहिए ?


संपादित करें:

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


और लिंक प्रश्न के उत्तर में कुछ सलाह है यहाँ दोहराया नहीं ...
dmckee --- पूर्व-मध्यस्थ kitten

जवाबों:


142

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

उदाहरण के लिए, यदि आप अपने मौजूदा पथ को लॉन्च करने के बाद .bashrcया जहां भी स्थापित करना चाहते हैं, उसे लॉन्च करना चाहते हैं :

PATH=whatever:you:want
launchctl setenv PATH $PATH

चल रहे अनुप्रयोगों में पर्यावरण चर स्वचालित रूप से अपडेट नहीं किए जाते हैं। आपको अपडेट किए गए पर्यावरण चर प्राप्त करने के लिए एप्लिकेशन को फिर से लॉन्च करने की आवश्यकता होगी (हालांकि आप अपने शेल में बस चर सेट कर सकते हैं, उदाहरण के PATH=whatever:you:wantलिए, टर्मिनल को फिर से शुरू करने की कोई आवश्यकता नहीं है)।


1
अब तक के सबसे अच्छे जवाब की तरह लग रहा है, एक 3 पार्टी ऐप की कोई ज़रूरत नहीं है!
अब्दुल्ला जिबली

2
यह वैश्विक प्रतीत नहीं होता है: पर्यावरण चर इस तरह से उपयोगकर्ता के लिए स्थानीय हैं। हमारे पास अभी भी एक पर्यावरण चर स्थापित करने के लिए एक वैश्विक तंत्र नहीं है ।
एंड्रयू

@ और इसका क्या मतलब है, उपयोगकर्ता के लिए स्थानीय? मुझे उम्मीद है कि बाद में लॉन्च से शुरू होने वाली सभी प्रक्रियाएं प्रभावित होंगी।
मैट कर्टिस

@MattCurtis: के माध्यम से निर्धारित पर्यावरण चर launchctl setenvकेवल परिवर्तन करने वाले उपयोगकर्ता को दिखाई देते हैं। यदि मैं एक चर को एक साधारण उपयोगकर्ता के रूप में सेट करता हूं, तो यह रूट (sudo के माध्यम से) और इसके विपरीत दिखाई नहीं देता है।
एंड्रयू

2
@ और ठीक है, रूट का अपना लॉन्च है - ps aux | grep launchdयह दिखाएगा। यह भी जांचें man sudoकि कौन से दस्तावेज sudo(डिफ़ॉल्ट रूप से) पर्यावरण को जानबूझकर रीसेट करते हैं - यदि आप sudo -Eइसे पर्यावरण को संरक्षित करेंगे (आपके द्वारा निर्धारित चर सहित launchctl setenv)। क्या आपके पास इसके लिए एक वास्तविक आवेदन है, वैसे? यदि हां, तो क्या यह विधि आपके लिए काम करती है?
मैट कर्टिस

299

कई स्थान हैं जहां आप पर्यावरण चर सेट कर सकते हैं।

  • ~/.profile: इसका उपयोग उन चर के लिए करें, जिन्हें आप टर्मिनल से लॉन्च किए गए सभी कार्यक्रमों में सेट करना चाहते हैं (ध्यान दें कि, लिनक्स के विपरीत, टर्मिनल। टैप में खोले गए सभी गोले लॉगिन गोले हैं)।
  • ~/.bashrc: यह उन गोले के लिए है, जो लॉगिन गोले नहीं हैं। इसे उपनामों और अन्य चीजों के लिए उपयोग करें जिन्हें उप-श्रेणियों में पुनर्परिभाषित करने की आवश्यकता है, न कि पर्यावरण चर जो विरासत में मिले हैं।
  • /etc/profile: यह ~ / .profile से पहले लोड किया गया है, लेकिन अन्यथा समकक्ष है। जब आप चाहते हैं कि चर मशीन पर सभी उपयोगकर्ताओं द्वारा शुरू किए गए टर्मिनल कार्यक्रमों पर लागू हो (मान लें कि वे बैश का उपयोग करते हैं)।
  • ~/.MacOSX/environment.plist: यह लॉगिन पर लॉगिनविंडो द्वारा पढ़ा जाता है। यह जीयूआई सहित सभी अनुप्रयोगों पर लागू होता है, 10.5 में स्पॉटलाइट द्वारा लॉन्च किए गए (10.6 नहीं) को छोड़कर। परिवर्तनों को प्रभावी करने के लिए आपको लॉगआउट करना होगा और फिर से लॉगिन करना होगा। यह फ़ाइल अब OS X 10.8 के रूप में समर्थित नहीं है।
  • आपके उपयोगकर्ता का launchdउदाहरण: यह उपयोगकर्ता, GUI और CLI द्वारा लॉन्च किए गए सभी कार्यक्रमों पर लागू होता है। आप किसी भी समय setenvकमांड का उपयोग करके परिवर्तन लागू कर सकते हैं launchctlसिद्धांत रूप में , आपको उपयोगकर्ता को लॉग इन करने पर setenvकमांड को अंदर रखने में सक्षम होना चाहिए ~/.launchd.conf, और launchdउन्हें स्वचालित रूप से पढ़ना होगा, लेकिन इस फाइल के लिए अभ्यास समर्थन में कभी भी लागू नहीं किया गया था। इसके बजाय, आप लॉगिन पर स्क्रिप्ट को निष्पादित करने के लिए किसी अन्य तंत्र का उपयोग कर सकते हैं, और उस स्क्रिप्ट launchctlको launchdपर्यावरण को स्थापित करने के लिए कॉल कर सकते हैं।
  • /etc/launchd.conf: यह लॉन्चड द्वारा पढ़ा जाता है जब सिस्टम शुरू होता है और जब उपयोगकर्ता लॉग इन करता है। वे सिस्टम पर हर एक प्रक्रिया को प्रभावित करते हैं, क्योंकि लॉन्च रूट प्रक्रिया है। रनिंग रूट लॉन्च में परिवर्तन लागू करने के लिए आप कमांड को पाइप कर सकते हैं sudo launchctl

समझने वाली मूलभूत बातें हैं:

  • पर्यावरण चर एक प्रक्रिया के बच्चों को विरासत में मिलते हैं, जब वे कांटे होते हैं।
  • रूट प्रक्रिया एक लॉन्च उदाहरण है, और उपयोगकर्ता सत्र के अनुसार एक अलग लॉन्च आवृत्ति भी है।
  • लॉन्चड आपको अपने वर्तमान परिवेश चर का उपयोग करने की अनुमति देता है launchctl; फिर अपडेट किए गए चर को तब से प्राप्त सभी नई प्रक्रियाओं द्वारा विरासत में मिला है।

लॉन्च के साथ पर्यावरण चर सेट करने का उदाहरण:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

अब, अपने GUI ऐप को लॉन्च करें जो वैरिएबल और वॉइला का उपयोग करता है!

तथ्य यह है कि ~/.launchd.confकाम नहीं करता है के आसपास काम करने के लिए , आप निम्नलिखित स्क्रिप्ट डाल सकते हैं ~/Library/LaunchAgents/local.launchd.conf.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>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

फिर आप setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEअंदर डाल सकते हैं ~/.launchd.conf, और इसे प्रत्येक लॉगिन पर निष्पादित किया जाएगा।

ध्यान दें, जब इस फैशन में एक कमांड लिस्ट को लॉन्चर में डाला जाता है, तो आप रिक्त स्थान वाले मानों के साथ पर्यावरण चर सेट करने में सक्षम नहीं होंगे। यदि आप ऐसा करने की जरूरत है, तो आप launchctl इस प्रकार कॉल कर सकते हैं: launchctl setenv MYVARIABLE "QUOTE THE STRING"

इसके अलावा, ध्यान दें कि लॉगिन पर चलने वाले अन्य प्रोग्राम लॉन्चर से पहले निष्पादित हो सकते हैं, और इस प्रकार यह सेट होने वाले पर्यावरण चर को नहीं देख सकता है।


3
वास्तव में, के बारे में ~/.MacOSX/environment.plist, मेरे शेर पर यह है पढ़ सकते हैं और इस्तेमाल किया। बस इसका परीक्षण किया। मैं वास्तव में इसे अधिक पसंद करता हूं ।launchd.conf क्योंकि मैं इसे बनाए रखने के लिए RCenvironment प्राथमिकता फलक का उपयोग करता हूं
गिलिमंजारो

5
~/.launchd.conf10.6.8 पर काम करने के लिए नहीं मिल सकता है - इसका कोई प्रभाव नहीं दिखता है। इसके अलावा मैन पेज का कहना है कि यह फ़ाइल वर्तमान में असमर्थित है।
स्नोक्रैस 09

4
~ / .launchd.conf 10.7.3 पर काम करने के लिए प्रतीत नहीं होता है या तो और जब मैं आदमी पेज में देखने के लिए यह $ HOME / .launchd.conf आपका launchd विन्यास फाइल का कहना है (वर्तमान में असमर्थित)
uncreative

4
10.8 (माउंटेन लायन) में, ~ / .MOSOSX / environment.plist अब समर्थित नहीं है। Apple देव के अनुसार, एक व्यक्ति को "LSEnvironment" डिक्शनरी में आपके द्वारा इच्छित पर्यावरण चर के साथ "। Info ofpl.app को बदलना होगा।" अधिक जानकारी के लिए, Apple.stackexchange.com/questions/57385/…
pnkfelix

3
@LaC बढ़िया है, व्यापक पद; क्या आप इसे नोट करने के लिए अद्यतन कर सकते हैं जो ~/.launchd.confअभी भी समर्थित नहीं है और OS X 10.8.3 के रूप में काम नहीं करता है? देखेंman launchd.conf
mklement0

12

मुझे लगता है कि ओपी जो देख रहा है वह एक सरल, विंडोज़ जैसा समाधान है।

ये रहा:

https://www.macupdate.com/app/mac/14617/rcenvironment


1
वाह, यह अच्छा लग रहा है। अभी तक यह कोशिश नहीं की है, लेकिन वास्तव में मुझे वर्णन से क्या चाहिए जैसा दिखता है।
अब्दुल्ला जिबली

6
btw, मूल लिंक टूट गया है जब से मैंने इसे पोस्ट किया है (क्या बात है Apple? 301 महंगी हैं?)। आप इसके बजाय इस लिंक का उपयोग कर सकते हैं: macupdate.com/app/mac/14617/rcenvironment
टॉम टेमन

यह वास्तव में पुराना है। ओएसएक्स 10.10 (योसेमाइट) और ऊपर भी काम करने वाले आधुनिक समाधान के लिए ऑक्स-एनव-सिंक का उल्लेख करने वाले अन्य उत्तर की जांच करें।
वॉरेन पी।

1
कृपया अपने उत्तर में लिंक से जानकारी संक्षेप में दें। जैसा कि हमने पहले ही देखा है, लिंक कई कारणों से टूटते हैं।
user3.1415927

7

आप लिनक्स पर पढ़ सकते हैं, जो कि मैक ओएस एक्स के काफी करीब है। या आप बीएसडी यूनिक्स पर पढ़ सकते हैं, जो थोड़ा करीब है। अधिकांश भाग के लिए, लिनक्स और बीएसडी के बीच का अंतर ज्यादा नहीं है।

/etc/profile सिस्टम वातावरण चर हैं।

~/.profile उपयोगकर्ता-विशिष्ट वातावरण चर रहे हैं।

"मुझे अपना JAVA_HOME चर कहां सेट करना चाहिए?"

  • क्या आपके पास कई उपयोगकर्ता हैं? वे परवाह करते हैं? क्या आप किसी अन्य उपयोगकर्ता को बदलकर गड़बड़ करेंगे /etc/profile?

आमतौर पर, मैं सिस्टम-वाइड सेटिंग्स के साथ गड़बड़ नहीं करना चाहता, भले ही मैं केवल उपयोगकर्ता हूं। मैं अपनी स्थानीय सेटिंग संपादित करना पसंद करता हूं।


5

GUI ऐप्स के लिए, आपको बनाना और संपादित करना होगा ~/.MacOSX/environment.plist। अधिक जानकारी यहाँ । इनको प्रभावी करने के लिए आपको लॉग आउट करना होगा। मुझे यकीन नहीं है कि वे टर्मिनल से लॉन्च किए गए एप्लिकेशन को भी प्रभावित करते हैं, लेकिन मुझे लगता है कि वे करेंगे।

टर्मिनल से लॉन्च किए गए एप्लिकेशन के लिए, आप ~ / .profile फ़ाइल को भी संपादित कर सकते हैं।


2
हां, टर्मिनल वेरिएबल को इनहेरिट करेगा, क्योंकि टर्मिनल से कुछ भी लॉन्च किया जाएगा। चर बनाए रखने के लिए आप RCenvironment प्राथमिकता फलक का उपयोग कर सकते हैं ।
गिलिमंजारो

1
यह समाधान अब मैक ओएस एक्स v10.7 के कुछ संशोधनों के साथ काम नहीं करता है। यह मैक ओएस एक्स v10.8 या अधिक से अधिक के किसी भी संशोधन के साथ ऐसा नहीं करता। इसके बजाय, देखें: stackoverflow.com/a/4567308/543738
LS

3

बस टर्मिनल के ~/.profileमाध्यम से, फ़ाइल खोलें nanoऔर वहां टाइप करें:

export PATH=whatever/you/want:$PATH

इस फ़ाइल को सहेजें (cmd + X और Y)। उसके बाद कृपया लॉगआउट / लॉगिन करें या बस टर्मिनल में एक नया टैब खोलें और अपने नए चर का उपयोग करने का प्रयास करें।

जो कुछ भी आप / आप चाहते हैं, उसके बाद ": $ PATH" जोड़ना न भूलें, अन्यथा आप पाथ चर में उन सभी रास्तों को मिटा देंगे, जो इससे पहले वहाँ थे।


4
यह केवल बैश कमांड वातावरण पर लागू होता है। आपके द्वारा यहां सेट किए गए चर GUI अनुप्रयोगों द्वारा नहीं देखे जाते हैं।
वारेन पी।

3

OSx- एन्वायर-सिंक के साथ एक ही स्रोत से कमांड लाइन और जीयूआई अनुप्रयोगों के लिए ओएस एक्स पर्यावरण चर को सिंक्रनाइज़ करें

मैं भी एक संबंधित प्रश्न का उत्तर पोस्ट यहाँ


यह शानदार है। सुझाव: एक स्क्रिप्ट में लांचक्टल अनलोड / लॉंटल लोड "रिफ्रेश नाउ" चीज़ डालें। मैंने इसे osx-env-sync-now.sh कहा। मैं अपने .bash_profile को संशोधित करता हूं और स्क्रिप्ट "लिटिल" रिफ्रेश करता हूं और जारी रखता हूं। मुझे लगता है कि यहां सुरक्षा निहितार्थ हैं, इसलिए मुझे लगता है कि कुछ सीमाएं बनाई जानी चाहिए। ऐसे कारण होने चाहिए, जब उन्होंने OS X में इस क्षमता को बंद कर दिया।
वॉरेन पी।

@ArrenPP पूरा हो गया! रेपो की जाँच करें।
Ersin एर

अति उत्कृष्ट। इससे मेरे लिए बहुत दर्द का हल हो गया। एक मामला जहां यह वास्तव में उपयोगी है, SCALA के साथ विकास करने वाले किसी भी व्यक्ति के लिए। दोनों आदेश पंक्ति स्केला और जीयूआई स्केला (जैसे NetBeans के रूप में) के लिए SCALA_HOME स्थापना एक असली दर्द अन्यथा है।
वॉरेन पी।

0

यदि आप macOS पर स्थायी रूप से पर्यावरण चर बदलना चाहते हैं, तो उन्हें सेट करें /etc/pathsध्यान दें , यह फ़ाइल केवल डिफ़ॉल्ट रूप से पढ़ी जाती है, इसलिए आपको लिखने की अनुमति के लिए chmod करना होगा ।


यह मेरे लिए काम नहीं करता है। मेरे पास /usr/bin/localउस फ़ाइल में है, यहां तक ​​कि फ़ाइल को संशोधित किए बिना, यह डिफ़ॉल्ट रूप से उस तरह से था, और फिर भी मेरे जीयूआई ऐप केवल देखते हैं /usr/bin:/bin:/usr/sbin:/sbin। मैं कई बार रिबूट।
mgol

@m_gol जब आप दौड़ते हैं तो आपको क्या मिलता है cat /etc/paths/?
इगोरगानापोलस्की

1
/ usr / स्थानीय / बिन, / usr / बिन, / बिन, / usr / sbin, / sbin, अलग-अलग लाइनों में। और फिर भी SourceTree पहले को छोड़कर उन सभी को देखता है।
15

आप "यदि आप macOS में डिफ़ॉल्ट पथ बदलना चाहते हैं" को संपादित करना चाह सकते हैं । पर्यावरण चर की सामान्य समस्या से इसका कोई लेना-देना नहीं है।
rfay

0

2020 मैक ओएस एक्स कैटालिना उपयोगकर्ताओं के लिए:

अन्य बेकार उत्तरों के बारे में भूल जाएं, यहाँ केवल दो चरणों की आवश्यकता है:

  1. नामकरण सम्मेलन के साथ एक फ़ाइल बनाएं: प्राथमिकता-ऐपनाम। फिर जिस पथ को आप जोड़ना चाहते हैं उसे कॉपी-पेस्ट करें PATH

    जैसे मेरे मामले में 80-vscodeसामग्री के साथ /Applications/Visual Studio Code.app/Contents/Resources/app/bin/

  2. उस फ़ाइल को स्थानांतरित करें /etc/paths.d/। टर्मिनल में एक नया टैब (नया सत्र) खोलने के लिए और टाइप करने के लिए मत भूलना echo $PATHदेखना होगा कि आपकी पथ जोड़ा जाता है!

सूचना: यह विधि केवल आपके पथ को जोड़ती है PATH

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