Launchd.conf aracılığıyla ortam değişkenlerini ayarlamak artık OS X Yosemite / El Capitan / macOS Sierra / Mojave'de çalışmıyor?


Yanıtlar:


159

Bu içeriğe sahip bir environment.plistdosya oluşturun ~/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>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
    launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
    launchctl setenv PATH $PATH:/Applications/gradle/bin
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Blok launchctliçine birçok komut ekleyebilirsiniz <string></string>.

plistSistem yeniden başlatıldıktan sonra devreye girer. launchctl load ~/Library/LaunchAgents/environment.plistHemen başlatmak için de kullanabilirsiniz .

[Düzenle]

Aynı çözüm El Capitan'da da işe yarıyor.

Xcode 7.0+, ortam değişkenlerini varsayılan olarak değerlendirmez. Eski davranış şu komutla etkinleştirilebilir:

defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO

[Düzenle]

Bunun pek işe yaramadığı birkaç durum var. Bilgisayar yeniden başlatılırsa ve "Oturum açarken pencereleri yeniden aç" seçilirse, yeniden açılan pencereler değişkenleri görmeyebilir (Belki de aracı çalıştırılmadan önce açılırlar). Ayrıca, ssh ile oturum açarsanız, değişkenler ayarlanmayacaktır (bu yüzden bunları ~ / .bash_profile olarak ayarlamanız gerekir). Son olarak, bu, El Capitan ve Sierra'da PATH için işe yaramıyor gibi görünüyor. Bunun 'launchctl config user path ...' ve / etc / paths ile ayarlanması gerekir.


20
Yeniden başlatmaya gerek yok! Sen "launchctl start environment.plist" yapabilir ve yeni env vars almak için ihtiyacınız olan uygulamayı yeniden başlatın;)
hasvn

1
Bu benim için PATH değişkeni ile işe yaramaz. Bu yüzden diğer değişkenleri ayarlamak için bu yaklaşıma ek olarak, ~ / .bash_profile dosyamda PATH değişkenini ayarladım. Bu her durum için işe yaramayabilir ama şimdiye kadar bir sorunum yok.
djule5

6
Anladım: Yeniden başlatmadan çalışmak için "launchctl load environment.plist" olmalı , başlamamalı
Dave Hartnoll

2
Ah evet. Tüm internette (google UseSanitizedBuildSystemEnvironment) tam olarak 9 kez görünen belirsiz bir yapılandırma ayarı gibi bir şey yok .
Ohad Schneider

2
Sierra'da da çalışıyor
Shwouchk

64

[ Orijinal cevap ]: Yine de tüm uygulamalar launchctl setenv variablename valuetarafından alınacak bir değişken ayarlamak için kullanabilirsiniz (terminal aracılığıyla başlatılanlara ek olarak Dock veya Spotlight üzerinden başlatılan grafik uygulamaları).

Açıkçası her giriş yaptığınızda bunu yapmak istemeyeceksiniz.

[ Düzenle ]: Bundan kaçınmak için başlatın AppleScript Editor, şöyle bir komut girin:

do shell script "launchctl setenv variablename value"

(Birden çok değişken ayarlamak istiyorsanız birden çok satır kullanın)

Şimdi ( + s) dosyasını Dosya biçimi: Uygulama olarak kaydedin . Son olarak System SettingsKullanıcılar ve GruplarGiriş Öğeleri'ni açın ve yeni uygulamanızı ekleyin.

[ Orijinal cevap ]: Bu yerde bir kısa kabuk komut dosyasında tanımlamak istediğiniz tüm değişkenleri çözmek için, MacOS oturum açma komut dosyası çalıştırmak için önceki bu yanıta bir göz atın . Bu şekilde, kullanıcı oturum açtığında komut dosyası çağrılır.

[ Düzenle ]: Değişkenler yalnızca belirli bir kullanıcı için ayarlanacağı için çözüm de mükemmel değildir, ancak tüm ihtiyacınız olabilecekleri umuyorum / tahmin ediyorum.

Birden fazla kullanıcınız varsa, her biri için manuel olarak bir Oturum Açma Öğesi ayarlayabilir veya aynı kabuk komut dosyasını işaret ederek yerel Kütüphane / LaunchAgents dizinlerinin her birine com.user.loginscript.plist'in bir kopyasını yerleştirebilirsiniz .

Bu çözümlerin hiçbiri /etc/launchd.conf kadar uygun değildir .

[ Daha Fazla Düzenleme ]: Aşağıdaki kullanıcı bunun için işe yaramadığını belirtiyor. Ancak birden fazla Yosemite makinesinde test yaptım ve benim için çalışıyor. Bir sorun yaşıyorsanız, bunun etkili olması için uygulamaları yeniden başlatmanız gerektiğini unutmayın. Ayrıca, terminalde ~ / .profile veya ~ / .bash_profile aracılığıyla değişkenler ayarlarsanız , kabuktan başlatılan uygulamalar için launchctl setenv aracılığıyla ayarlanan şeyleri geçersiz kılarlar .


5
Anlayabildiğim kadarıyla, bu tekniğin bir dezavantajı, girişte başlayan diğer uygulamalar için değişkenlerin ayarlanmayacağıdır. Örneğin, Terminal'i açarsanız, değişken ayarlanır, ancak yeniden oturum açar ve yeniden oturum açarsanız, Terminal'in otomatik olarak yeniden başlatılmasıyla, değişken ayarlanmayacaktır ...
JasonD 20:14

Bu çözümü denedim ve benim için de işe yaramadı. Ama özellikle Java IDE (IntelliJ) benim yol değişiklikleri almak bekliyorum ve değil. Her şey terminalden gayet iyi çalışıyor. IntelliJ'de bir hata olabilir. Apple'ın bu işlevselliği kaldırmasından dolayı hala sinir bozucu. Apple'ı aradım ve çok yardımcı olmadılar.
Jason

Bu benim için çalışıyor, ancak sudo ortam değişkenlerini de eklemek için ne yapacağınızı biliyor musunuz?
etiennenoel

2
Bu genel olarak işe yarayacaktır, ancak Yosemite'de (en azından 10.10.0 ve 10.10.1) $ PATH ayarının bu şekilde çalışmadığı bir hata vardır. Apple hatanın farkında. Şu anda (10.10.1'den itibaren) GUI uygulamaları için sistem genelinde $ PATH belirlemenin bilinen bir yolu yoktur.
TJ Luoma

3
Yukarıda belirtilen yöntemlerden birini kullandıktan ve dizüstü bilgisayarınızı yeniden başlattıktan sonra - Uygulamaları (iTerm, terminal, Eclipse, IDEA veya kullandığınız her şey gibi) açıkça yeniden açtığınızdan emin olun. Bunları açıkça yeniden başlatmazsanız ve OSx yeniden başlatılırken, onay kutusu "Oturum açarken pencereleri yeniden başlat" olarak işaretlenirse (varsayılan değer budur) - bu programlar yeni ortam değişkenlerini okumaz.
koştu

21

Mac OS X 10.10 Yosemite'de ortam değişkenlerini 3 dosya + 2 komutla ayarlamak mümkündür.

Ortam değişkenleri tanımı içeren ana dosya:

$ ls -la /etc/environment 
-r-xr-xr-x  1 root  wheel  369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh

set -e

syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"

launchctl setenv JAVA_HOME      /usr/local/jdk1.7
launchctl setenv MAVEN_HOME     /opt/local/share/java/maven3

if [ -x /usr/libexec/path_helper ]; then
    export PATH=""
    eval `/usr/libexec/path_helper -s`
    launchctl setenv PATH $PATH
fi

osascript -e 'tell app "Dock" to quit'

syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"

Kullanıcı uygulamaları (terminal, IDE, ...) için ortam değişkenlerini yüklemek için hizmet tanımı:

$ ls -la /Library/LaunchAgents/environment.user.plist
-rw-------  1 root  wheel  504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.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>environment.user</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

Kök kullanıcı uygulamaları için aynı hizmet tanımı:

$ ls -la /Library/LaunchDaemons/environment.plist
-rw-------  1 root  wheel  499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.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>environment</string>
    <key>ProgramArguments</key>
    <array>
            <string>/etc/environment</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment</string>
    </array>
</dict>
</plist>

Ve son olarak şu hizmetleri kaydetmeliyiz:

$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist

Ne elde ediyoruz:

  1. Sistem ortam değişkenlerini bildiren tek yer: / etc / environment
  2. / Etc / environment dosyasının değiştirilmesinden sonra ortam değişkenlerinin anında otomatik güncellenmesi - uygulamanızı yeniden başlatmanız yeterlidir

Sorunlar / sorunlar:

Env değişkenlerinizin sistem yeniden başlatıldıktan sonra uygulamalar tarafından doğru bir şekilde alınabilmesi için ihtiyacınız olacak:

  • iki kez giriş yapın: login => logout => login
  • veya env değişkenlerinin alınması gereken uygulamaları manuel olarak kapatıp yeniden açın
  • veya "Tekrar giriş yaparken pencereleri yeniden aç" özelliğini KULLANMAYIN.

Bu, Apple'ın yüklenen hizmetlerin açık bir şekilde sıralanmasını reddetmesi nedeniyle olur, bu nedenle env değişkenleri "yeniden aç" kuyruğunun işlenmesine paralel olarak kaydedilir.

Ama aslında, sistemimi yılda sadece birkaç kez (büyük güncellemelerde) yeniden başlatıyorum, bu yüzden önemli değil.


İyi fikir. Ben denedim ve çoğu ortam değişkenleri (gibi JAVA_HOME) için çalışır , ancak PATHdeğişken için değil ( farklı sormak benim soru bakın ).
halloleo

4
PATH / etc / paths dosyası ile ayarlanmalıdır. Özel yolunuzu bu dosyanın sonuna ekleyin.
ursa

Ben bu kadar aşina değilim launchd, ama bu Daemons'u (yani giriş yapmadan önce) açılışta yüklemek mümkün olmaz mıydı? Bu, bahsettiğiniz tüm sorunları atlatmalıdır.
Egon

Yukarıdaki yaklaşımı seviyorum, ancak yönetmek için garip bir sorunum var. Bir genet VARNAME yeniden başlatıldıktan sonra bana doğru değeri döndürür, ancak echo $ VARNAME hiçbir şey döndürmez. Bunun bir nedeni ne olabilir? Bunu stackoverflow.com/questions/27045137/… ' da da yayınladım ve buradaki herkesin bir fikri olduğunu umuyorum
ctp

/ Etc / environment dosya izinlerinin yukarıda açıklandığı gibi olduğundan emin olun.
imanuelcostigan

6

Alıntı yapılan

Apple Developer Relations 10-Oct-2014 09:12 PM

Çok fazla müzakereden sonra, mühendislik bu özelliği kaldırmıştır. /etc/launchd.confGüvenlik nedeniyle dosya bilerek kaldırılmıştır. Geçici bir çözüm olarak, launchctl limitönyükleme sırasında belki de bir LaunchDaemon. (...)

Çözüm:

Kodu /Library/LaunchDaemons/com.apple.launchd.limit.plistbash-script ile girin:

#!/bin/bash

echo '<?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>eicar</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/launchctl</string>
                <string>limit</string>
                <string>core</string>
                <string>unlimited</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>ServiceIPC</key>
        <false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist

1
Bunu biraz daha açıklayabilir misiniz? 'Sorunu Çöz'ün' ilk sorunla nasıl bir ilişkisi olduğunu göremiyorum!
Nick H247

OP değil, ama ben burada özü olduğunu düşünüyorum: bu plist koymak ve komutu çalıştırmak için /Library/LaunchDaemonssöylemek yerine , komut ve bağımsız değişken olarak bir yol dizesi çalıştırmak için söyle . başlangıçta otomatik olarak almalı ve neredeyse anında kendi kendini değiştirmelidir. launchctllimitsetenvPATHlaunchd
Laird Nelson

5
XML eksik olarak kopyalandı. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Öğreti

6
@aax bu plist'in hangi kısmı aslında bir ortam değişkeni belirler?
HairOfTheDog

3

Eski davranışı geri yüklemek için komutlar şunlardır:

# create a script that calls launchctl iterating through /etc/launchd.conf
echo '#!/bin/sh

while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
' > /usr/local/bin/launchd.conf.sh

# make it executable
chmod +x /usr/local/bin/launchd.conf.sh

# launch the script at startup
echo '<?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>launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>/usr/local/bin/launchd.conf.sh</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist

Şimdi gibi komutları belirtebilirsiniz setenv JAVA_HOME /Library/Java/Homeiçinde /etc/launchd.conf.

El Capitan üzerinde kontrol etti.


2

Benim için ne işe yaradı (aax 'dan ilham aldım' teşekkürler):

Bunu /Library/LaunchDaemons/com.apple.launchd.limit.plist'e yapıştırın ve ardından yeniden başlatın :

<?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>eicar</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/launchctl</string>
    <string>limit</string>
    <string>maxfiles</string>
    <string>16384</string>
    <string>16384</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>ServiceIPC</key>
  <false/>
</dict>
</plist>

Adım adım ihtiyacınız varsa:

  • Terminali başlat
  • Type sudo su daha sonra root olarak giriş yapmak için şifrenizi girin
  • Tip vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
  • Vi düzenleyicisine girdiğinizde, ekleme moduna girmek için i tuşuna basın ve ardından tam kod içeriğini yukarıya yapıştırın ( ⌘+v). Bu, sınırı işlem başına 16384 dosya ve toplam 16384 dosyaya zorlar
  • Dosyanızı kaydedin ve kullanma çıkın escsonra:wq
  • Sisteminizi yeniden başlatın ve launchctl komutunu kullanarak çalışıp çalışmadığını kontrol edin

Umarım bu sana yardımcı olmuştur.


10
Bu çözümün ortam değişkenlerini ayarlamakla ne ilgisi var?
2014

2

Sen verebilir https://github.com/ersiner/osx-env-sync bir deneyin. Bu kolları hem komut satırı ve GUI uygulamaları bir gelen tek bir kaynaktan ve eserleri withe OS X en son sürümünü (Yosemite).

Yazdıklarınız ilk etapta bash tarafından kaynaklanacak düzenli bash betiği olduğundan yol ikamelerini ve diğer kabuk numaralarını kullanabilirsiniz. Kısıtlama yok .. ( osx-env-sync belgelerine bakın ve bunu nasıl başardığını anlayacaksınız.)

Burada daha fazlasını bulacağınız benzer bir soruyu yanıtladı .


-3

Çözüm değişkeninizi eklemektir /etc/profile. Sonra her şey beklendiği gibi çalışıyor! Tabii ki bunu sudo nano / etc / profile ile kök kullanıcı olarak yapmalısınız. Başka bir yolla düzenlerseniz, kök izinlerini değiştirseniz bile sistem hasarlı / etc / profile ile şikayet eder.


7
Profile ortam değişkenleri eklemek, yalnızca kabuk işlemlerini etkilediğinden çok daha düşüktür.
UloPe

-5

~ / .Bash_profile değişkenlerini aşağıdaki şekilde ekledim. İşiniz bittikten sonra yeniden başlatın / oturumu kapatın ve oturum açın

export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH

NOT: yeniden başlatma / oturum kapatma ve oturum açma olmadan bu değişiklikleri uygulayabilirsiniz;

source ~/.bash_profile

Oturumu kapatıp tekrar açmanız gerekmediğini unutmayın. Sadece source .bash_profile kaynağını kullanın.
Michael

2
Ayrıca, bu yöntemle ilgili sorun, ortam değişkenleri kullanılabilir olmadan önce yine de bir terminal açmak zorunda olmasıdır. İlk cevapta olanı yapmak daha iyidir, böylece terminal açmak zorunda kalmadan kullanılabilirler.
Michael

1
Bu, SpotLight aracılığıyla yüklenen uygulamalarda çalışmaz. stackoverflow.com/questions/135688/…
Rasika Perera

1
Bash config dosyalarını kullanmak sınırlı bir yardımcıdır, çünkü her zaman etkilemeye çalıştığınız ortamın sürecinin atası olarak bash aldığınız varsayılır. Spot ışığı, bulucu, emacs, xcode, cronjobs, launchd aracıları, herhangi bir IDE, kaynak kontrol tarayıcısı, vb. Bunları tutarlı bir şekilde kapsayabilen tek süreç fırlatıldı.
Ben Hyde
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.