OSX Yosemite'de neden GUI uygulamaları için birçok ortam değişkeni ayarlayabilirim, ancak belirli PATH değişkenini ayarlayamıyorum


16

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.rcsenaryoyu şö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_helperyazmamak 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_HOMEve ENVIRONMENT_RCbuna göre ayarlanır environment.rc, ancak PATH

/ Usr / bin: / bin

Emin olmak için, hiçbir bashinit 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ı: bashTerminal 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; ispellemacs'ı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)

Yanıtlar:


3

Yosemite içindeki PATH / etc / paths dosyasında ayarlanabilir ve ayarlanmalıdır. Sadece bu dosyanın sonuna yolunuzu ekleyin:

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

/ etc / original script içindeki ortam betiği GUI uygulamalarındaki PATH değişkeni için destek sağlar (Emacs ile test edilmiştir).


5
Bu, yalnızca/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.
halloleo

Orijinal yazıdaki yanıtı ve / etc / çevre komut dosyasını güncelledim
ursa

Bu bir tane verdiğiniz iki
cevaptır

@mark (1) bu soru sorulduktan sonra / etc / ortamını güncelledim ve şimdi PATH'i destekliyor. (2) Buradaki cevap / etc / paths kullanmaktır
ursa

2
@mark Evet, tam da benim amacım, sorunum ve sorum: GUI uygulamalarının ortam değişkeni PATH'ı Finder aracılığıyla başlatıldığında nasıl ayarlayabilirim? Yine de, bunun için gerçek bir genel çözüm yok ...
halloleo

2

Bu beni uzun süre şaşırttı (son birkaç saat). Sonunda sorunumu tam olarak açıklayan bu hata raporuna girdim (sorununuzla ne kadar ilişkili olduğundan emin değilim, ancak Yosemite / launchd'de PATH ve komut dosyalarıyla birlikte bir hata var gibi görünüyor. python olarak:

http://www.openradar.me/18945659

Çözüm, daha sonra python'u başlatan bir kabuk betiği başlatmak gibi görünüyor. Gerçekten sevdiğim gibi değil, ama bu şekilde ....


Hata raporuna bağlantı için teşekkürler. Şimdilik güzel bir hata. Etrafında başka bir kavrama buldum; Buraya göndereceğim.
halloleo

1

Sorun, launchd'ın ortamdaki değişkenin yerine başka bir PATH değişkeni eklemesidir. Çoğu program getenv, her zaman bir değişkenin ilk oluşumunu döndüren kullanır , bunun yerine tüm ortam değişkenleri arasında yineleme yapar ve bunları yerel değişkenler olarak içe aktarır, böylece önceki örneklerin sonuncusunun üzerine yazar.

Bu açıkça bir başlatma hatası, bir programa geçirilen ortam değişkenleri benzersiz olmalıdır.


1
Serin arka plan cevap! Sanırım kabuklarında gerçek bir yol yok, ya da var mı?
halloleo

@halloleo Sen olarak komutunu başlatabilir sh -c 'YOUR ORIGINAL COMMAND'toplama, kabuk olsa geçirir PATHlaunchd içinde set.
StenSoft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.