मैं 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)
/usr/libexec/path_helper
उनकी प्रारंभिक प्रक्रिया के दौरान कॉल करते हैं। GUI एप्स को PATH के अनुसार नहीं मिलता है/etc/paths
- और मैंने विशेष रूप से GUI एप्स के बारे में पूछा।