OSX Yosemite में, मैं GUI ऐप्स के लिए कई पर्यावरण चर क्यों सेट कर सकता हूं, लेकिन विशिष्ट चर PATH सेट नहीं कर सकता


16

मैं Mavericks रिलीज तक OSX 'PATH मुद्दों को हल करने के बाद, समस्याओं Yosemite में वापस आ गए !!!

इसलिए मैं launch.confनए मैक OSX 10.10 Yosemite रिलीज में पुरानी सुविधा की नकल करना चाहता हूं , ताकि GUI ऐप में PATH पर्यावरण चर जैसे कार्बन Emacs या RStudio उपलब्ध हो। मैंने स्टैकओवरफ़्लो उपयोगकर्ता ursa के महान विचार का उपयोग एक शेल स्क्रिप्ट को सेट करने के लिए किया है जो पर्यावरण चर को कॉन्फ़िगर करता है launchctl। (उसका स्टैकओवरफ़्लो उत्तर यहां देखें ।) यह अधिकांश पर्यावरण चर के लिए काम करता है, लेकिन पथ परिवर्तन के लिए नहीं

1. मैंने क्या किया है?

पहले मैंने /etc/environment.rcपटकथा लिखी जैसे कि:

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

फिर मैंने launchdनीचे दिए गए परिशिष्ट में (इनमें से और अन्य उल्लिखित लिपियों की सूची दी)। फिर मैंने उन्हें सक्रिय किया

$ sudo launchctrl load ...

फिर मैंने path_helperशेल इनिट फ़ाइल /etc/प्रोफ़ाइल में उपयोगिता को अक्षम कर दिया , ताकि यह environment.rcसेटिंग्स को ओवरराइट न करे । और अंत में मैंने मशीन को फिर से चालू किया।

2. क्या प्रभाव है?

जब मैं नया पर्यावरण चर टर्मिनल शुरू करता हूं JAVA_HOMEऔर उसके ENVIRONMENT_RCअनुसार सेट किया जाता है environment.rc, लेकिन PATH को सेट किया जाता है

/ Usr / bin: / bin

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

तो क्यों मैं दूसरे चर सेट कर सकते हैं, लेकिन नहीं पथ चर? और मैं इसे एकीकृत तरीके से कैसे हल कर सकता हूं ?

अपडेट करें:

स्थिति बहुत ही हैरान करने वाली है: bashटर्मिनल या Emacs में शेल ( कम से कम) आपके द्वारा सेट किए गए PATH को उठाएगा launchctl, लेकिन अन्य GUI ऐप्स ऐसा नहीं करेंगे। उदाहरण के लिए, सीधे उल्लेखित न्यूनतम पायथन स्क्रिप्ट जिसे प्लैटिपस के माध्यम से बुलाया गया है, आपका रिवाज नहीं दिखाएगा। पथ। और यहां तक ​​कि Emacs को भी सही PATH का पता नहीं है: जब आप Emacs कमांड जारी करते हैं, तो आप इसे देखते हैं M-x ispell-buffer; यूनिक्स उपकरण ispellजो एमएसीएस कॉल करने की कोशिश करता है वह नहीं मिलेगा यदि यह आपके कस्टम पथ पर है।


अनुबंध

net.halloleo.environment.plistमें लॉन्च config फाइल /Library/LaunchDaemons/:

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plistमें लॉन्च config फाइल /Library/LaunchAgents/:

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profileसंशोधित बैश स्टार्ट-अप फ़ाइल:

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.pyस्क्रिप्ट, जो सभी पर्यावरण चर दिखाती है:

import os
print (os.environ)

जवाबों:


3

Yosemite में पथ और / etc / paths फ़ाइल में सेट किया जाना चाहिए। इस फ़ाइल के अंत में अपना पथ जोड़ें:

/usr/bin
/bin
/your/custom/path

मूल पोस्ट में / etc / पर्यावरण स्क्रिप्ट GUI अनुप्रयोगों में पैट वैरिएबल (Emacs के साथ परीक्षण) के लिए समर्थन प्रदान करता है।


5
यह केवल गोले के लिए काम करता है जो /usr/libexec/path_helperउनकी प्रारंभिक प्रक्रिया के दौरान कॉल करते हैं। GUI एप्स को PATH के अनुसार नहीं मिलता है /etc/paths- और मैंने विशेष रूप से GUI एप्स के बारे में पूछा।
12

मैंने मूल पोस्ट में उत्तर और / etc / पर्यावरण स्क्रिप्ट को अपडेट किया है
ursa

यह दो उत्तर हैं जो आप दे रहे हैं - यह भी ओपी कहता है / आदि / पर्यावरण काम नहीं करता है
user151019

@mark (1) इस सवाल के उठने के बाद मैंने अपडेट किया है / etc / environment, और अब यह PATH को सपोर्ट करता है। (२) यहाँ उत्तर का उपयोग करना है / etc / पथ
ursa २14

2
@ हाँ, और यह बिल्कुल मेरी बात, समस्या और सवाल है: मैं खोजक के माध्यम से लॉन्च किए जाने पर जीयूआई एप्लिकेशन के पर्यावरण चर को कैसे सेट कर सकता हूं? फिर भी, दृष्टि में इसके लिए कोई वास्तविक सामान्य समाधान नहीं है ...
हेल्लोएलो

2

इसने मुझे लंबे समय के लिए हैरान कर दिया (ठीक है, घंटे के आखिरी जोड़े)। अंत में मैं इस बग रिपोर्ट में भाग गया, जो वास्तव में मेरी समस्या का वर्णन करने के लिए लगता है (मुझे यकीन नहीं है कि यह आपकी समस्या से संबंधित है, लेकिन PATH और लिपियों के साथ संयोजन में Yosemite / launchd में एक बग लगता है) अजगर के रूप में:

http://www.openradar.me/18945659

समाधान एक शेल स्क्रिप्ट को शुरू करने के लिए लगता है जो तब अजगर शुरू करता है। नहीं वास्तव में मुझे क्या पसंद है, लेकिन यह जिस तरह से है ...।


बग रिपोर्ट के लिंक के लिए धन्यवाद। अब यह एक अच्छा बग है। मुझे इसके आसपास एक और क्लच मिला; मैं इसे यहाँ पोस्ट करूँगा।
०१:०१ बजे

1

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

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


1
कूल बैकग्राउंड जवाब! मुझे लगता है कि गोले में इधर-उधर असली रास्ता नहीं है, या है?
आधा

@halloleo आप कमांड को लॉन्च कर सकते हैं, sh -c 'YOUR ORIGINAL COMMAND'जो इसे खोल के पास देता है, PATHलॉन्च में सेट को उठाता है ।
स्टेनसॉफ्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.