Mavericks sürümüne kadar OSX'in PATH sorunlarını çözdükten sonra , sorunlar Yosemite'de geri geliyor !!!
Bu yüzden Carbon Emacs veya RStudiolaunch.conf
gibi GUI uygulamalarında PATH ortam değişkeninin olması için yeni Mac OSX 10.10 Yosemite sürümündeki eski özelliği taklit etmek istiyorum . Ortam değişkenlerini yapılandıran bir kabuk betiği oluşturmak için stackoverflow kullanıcısı ursa'nın harika fikrini kullandım . ( Burada yığın akışı yanıtına bakın .) Bu, çoğu ortam değişkeni için çalışır, ancak PATH değişkeni için çalışmaz .launchctl
1. Ne yaptım?
Önce /etc/environment.rc
senaryoyu şöyle yazdım :
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"
Sonra için plistleri oluşturdum launchd
(aşağıdaki ekte bu ve diğer komut dosyalarının listeleri). Sonra onları
$ sudo launchctrl load ...
Sonra ayarları üzerine path_helper
yazmamak için kabuk init dosya /etc/
profilindeki yardımcı programı devre dışı bıraktım environment.rc
. Ve sonunda makineyi yeniden başlattım.
2. etkisi nedir?
Terminal'i başlattığımda yeni ortam değişkenleri JAVA_HOME
ve ENVIRONMENT_RC
buna göre ayarlanır environment.rc
, ancak PATH
/ Usr / bin: / bin
Emin olmak için, hiçbir bash
init dosyası var geçerli ortamda değişkenleri göstermek için (ek olarak) yerine küçük bir python komut dosyası yazdım var ve ben doğrudan bir Platypus sarıcı çift tıklayarak yürütmek . Yine yeni değişkenler ayarlanır, PATH ise sistem varsayılanına sahiptir.
Öyleyse neden PATH değişkenini değil diğer değişkenleri ayarlayabilirim ? Ve bunu birleşik bir şekilde nasıl çözebilirim ?
Güncelleme:
Durum çok kafa karıştırıcı: bash
Terminal veya Emacs'daki kabuk ( en azından) üzerinden ayarladığınız YOLU alacak launchctl
, ancak diğer GUI uygulamaları bunu yapmayacaktır., Örneğin Platypus aracılığıyla düz olarak adlandırılan minimal python betiği özelliğinizi göstermeyecektir. yolu. Ve Emacs bile doğru PATH'ı bilmiyor: Bunu fark edersiniz, örneğin Emacs komutunu verdiğinizde M-x ispell-buffer
; ispell
emacs'ın çağırmaya çalıştığı unix aracı , yalnızca özel yolunuzda bulunuyorsa bulunmaz.
apandis
net.halloleo.environment.plist
, launchd yapılandırma dosyası /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
, launchd yapılandırma dosyası /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
, değiştirilmiş bash başlangıç dosyası:
# 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
, tüm ortam değişkenlerini gösteren komut dosyası:
import os
print (os.environ)
/usr/libexec/path_helper
başlatma işlemleri sırasında çağrılan mermiler için işe yarar . GUI uygulamaları do not göre PATH olsun/etc/paths
- ve GUI uygulamaları hakkında özellikle istedi.