Mac OS X'te ortam değişkenleri


186

Güncelleme: Aşağıdaki bağlantının tam bir cevabı yok . Yolu veya değişkeni iki yerde (biri GUI ve diğeri kabuk için) ayarlamak zorunlu değildir.

Yinelenmeyenler : OS X'te ortam değişkenleri ayarlanıyor mu?


Ortam değişkenlerini ayarlamanın ve değiştirmenin çok kolay olduğu bir Windows arka planından geliyorsa (Sistem Özellikleri> Gelişmiş> Ortam Değişkenleri'ne gidin), Mac OS 10.5'te bu kadar basit görünmüyor. Referansların çoğu / etc / profile veya ~ / .profile dosyasını güncellemem gerektiğini söylüyor. Bunlar Sistem Değişkenleri ve Kullanıcı Değişkenlerine eşdeğer mi? Örneğin, JAVA_HOMEdeğişkenimi nerede ayarlamalıyım ?


DÜZENLE:

Değişken terminalden ve Eclipse gibi bir uygulamaya erişebilmek istiyorum. Ayrıca, bunun etkili olması için yeniden çıkış / çıkış yapmam gerekmediğini umuyorum.


Ve burada tekrarlanmayan bağlantı sorusunun cevaplarında bazı tavsiyeler var ...
dmckee --- eski moderatör yavru kedi

Yanıtlar:


142

Çoğaltmaya gerek yok. Launchd (ve alt işlemler, yani Spotlight'tan başladığınız her şey) tarafından kullanılan ortam değişkenlerini kullanarak ayarlayabilirsiniz launchctl setenv.

Örneğin, şu anda .bashrcveya herhangi bir yere kurduktan sonra mevcut yolunuzu launchd'de yansıtmak istiyorsanız :

PATH=whatever:you:want
launchctl setenv PATH $PATH

Ortam değişkenleri çalışan uygulamalarda otomatik olarak güncellenmez. Güncellenmiş ortam değişkenlerini almak için uygulamaları yeniden başlatmanız gerekir (ancak kabuğunuzda yalnızca değişkenler ayarlayabilirsiniz, örneğin PATH=whatever:you:want; terminali yeniden başlatmanıza gerek yoktur).


1
Şimdiye kadar en iyi cevap gibi görünüyor, 3. parti bir uygulama gerek yok!
Abdullah Jibaly

2
Bu global görünmüyor: bu şekilde ayarlanan ortam değişkenleri kullanıcı için yereldir. Hala bir ortam değişkeni belirlemek için küresel bir mekanizmamız yok .
Andrew

@Andrew Ne demek, kullanıcı için yerel? Daha sonra fırlatmadan başlatılan tüm işlemlerin etkilenmesini beklerdim.
Matt Curtis

@MattCurtis: Üzerinden ayarlanan ortam değişkenleri launchctl setenvyalnızca değişikliği yapan kullanıcı tarafından görülebilir. Bir değişkeni sıradan bir kullanıcı olarak ayarlarsam, root (sudo üzerinden) ve tersi görünmez.
Andrew

2
@Andrew OK, root'un kendi başlatması var - ps aux | grep launchdbunu gösterecek. Ayrıca man sudo, hangi belgeleri sudo(varsayılan olarak) çevreyi kasıtlı olarak sıfırladığını kontrol edin - çevreyi sudo -Ekoruyacaksanız (ayarladığınız değişkenler dahil launchctl setenv). Bu arada, bunun için gerçek bir başvurunuz var mı? Öyleyse, bu yöntem sizin için çalışıyor mu?
Matt Curtis

299

Ortam değişkenlerini ayarlayabileceğiniz birkaç yer vardır.

  • ~/.profile: terminalden başlatılan tüm programlarda ayarlamak istediğiniz değişkenler için bunu kullanın (Linux'un aksine, Terminal.app'de açılan tüm kabukların giriş kabukları olduğuna dikkat edin).
  • ~/.bashrc: Giriş kabukları olmayan mermiler için çağrılır. Diğer adlar ve devralınan ortam değişkenleri için değil, alt kabuklarda yeniden tanımlanması gereken diğer şeyler için kullanın.
  • /etc/profile: bu ~ / .profile dosyasından önce yüklenir, aksi takdirde eşdeğerdir. Değişkenin, makinedeki tüm kullanıcılar tarafından başlatılan (bash kullandıkları varsayılarak) terminal programlarına uygulanmasını istediğinizde kullanın.
  • ~/.MacOSX/environment.plist: Bu girişte loginwindow tarafından okunur. Spotlight tarafından 10.5'te başlatılanlar (10.6 değil) dışında, GUI'lar da dahil olmak üzere tüm uygulamalar için geçerlidir. Değişikliklerin geçerli olması için oturumu kapatıp tekrar oturum açmanızı gerektirir. Bu dosya OS X 10.8'den itibaren desteklenmemektedir.
  • kullanıcı launchdörneğiniz: bu kullanıcı, GUI ve CLI tarafından başlatılan tüm programlar için geçerlidir. İçindeki setenvkomutu kullanarak istediğiniz zaman değişiklikleri uygulayabilirsiniz launchctl. Teoride , kullanıcı oturum açtığında setenvkomutları girebilmeniz ~/.launchd.confve launchdbunları otomatik olarak okuyabilmeniz gerekir, ancak pratikte bu dosya için destek asla uygulanmadı. Bunun yerine, oturum açma sırasında bir komut dosyası yürütmek için başka bir mekanizma kullanabilir launchctlve launchdortamı ayarlamak için bu komut dosyasını çağırabilirsiniz .
  • /etc/launchd.conf: Bu, sistem başlatıldığında ve bir kullanıcı oturum açtığında launchd tarafından okunur. Sistemdeki her işlemi etkiler, çünkü launchd kök işlemidir. Çalışan kök fırlatma aracında değişiklik uygulamak için komutları ekleyebilirsiniz sudo launchctl.

Anlaşılması gereken temel şeyler:

  • ortam değişkenleri, bir sürecin çocukları tarafından çatallandıkları anda miras alınır.
  • root işlemi bir launchd örneğidir ve kullanıcı oturumu başına ayrı bir launchd örneği de vardır.
  • launchd, geçerli ortam değişkenlerini aşağıdakileri kullanarak değiştirmenize olanak tanır launchctl; güncellenen değişkenler daha sonra çatallandığı tüm yeni süreçler tarafından devralınır.

Launchd ile ortam değişkeni ayarlama örneği:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Şimdi, değişkeni kullanan GUI uygulamanızı başlatın ve voila!

Çalışmayan gerçeği geçici olarak ~/.launchd.confçözmek için, aşağıdaki komut dosyasını içine koyabilirsiniz ~/Library/LaunchAgents/local.launchd.conf.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>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Sonra setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEiçine koyabilirsiniz ~/.launchd.confve her girişte yürütülecektir.

Bir komut listesini bu şekilde launchctl dosyasına bağlarken, boşluk içeren değerlere sahip ortam değişkenlerini ayarlayamayacağınızı unutmayın. Bunu gerekirse aşağıdaki gibi launchctl çağırabilirsiniz: launchctl setenv MYVARIABLE "QUOTE THE STRING".

Ayrıca, oturum açma sırasında çalışan diğer programların lanshagenttan önce yürütülebileceğini ve bu nedenle ayarladığı ortam değişkenlerini göremeyebileceğini unutmayın.


3
Aslında ilişkin ~/.MacOSX/environment.plist, benim Lion onu olduğu okuyup kullandı. Sadece test ettim. Aslında onu korumak için RCenvironment tercih bölmesini kullandığım için .launchd.conf yerine tercih ederim .
Gilimanjaro

5
Alınamıyor ~/.launchd.conf10.6.8 çalışmalarına - Bir etkisi olması için görünmüyor. Ayrıca man sayfası bu dosyanın şu anda desteklenmediğini söylüyor.
snowcrash09

4
~ / .launchd.conf 10.7.3 üzerinde de çalışmıyor gibi görünüyor ve man sayfasına baktığımda $ HOME / .launchd.conf Launchd yapılandırma dosyanız (şu anda desteklenmiyor)
yaratıcı değil

4
10.8'de (Mountain Lion), ~ / .MacOSX / environment.plist artık desteklenmemektedir. Apple Dev'e göre, ".app öğesinin Info.plist'ini istediğiniz ortam değişkenleriyle bir" LSEnvironment "sözlüğü içerecek şekilde değiştirin." Daha fazla bilgi için bkz. Apple.stackexchange.com/questions/57385/…
pnkfelix

3
@LaC Harika, kapsamlı gönderi; ~/.launchd.confhala desteklenmediğini ve OS X 10.8.3'ten itibaren çalışmadığını not etmek için güncelleyebilir misiniz ? Bkz.man launchd.conf
mklement0

12

Bence OP aradığı şey basit, pencereye benzer bir çözüm.

İşte başlıyoruz:

https://www.macupdate.com/app/mac/14617/rcenvironment


1
Vay canına, bu harika görünüyor. henüz denemedim ama tam açıklamadan ne gibi görünüyor.
Abdullah Jibaly

6
btw, yayınladığımdan beri orijinal bağlantı kopmuş gibi görünüyor (Apple? 301'ler pahalı mı?). Bunun yerine bu bağlantıyı kullanabilirsiniz: macupdate.com/app/mac/14617/rcenvironment
Tom Teman

Bu gerçekten eskidir. OS X 10.10 (Yosemite) ve üstü sürümlerde bile çalışan modern bir çözüm için osx-env-sync'den bahseden diğer cevaba göz atın.
Warren P

1
Lütfen cevabınızdaki linkten bilgileri özetleyin. Daha önce de gördüğümüz gibi, bağlantılar çeşitli nedenlerle kopuyor.
user3.1415927

7

Mac OS X'in ne olduğuna oldukça yakın olan linux'u okuyabilirsiniz. Ya da biraz daha yakın olan BSD Unix'i okuyabilirsiniz. Çoğunlukla, Linux ve BSD arasındaki farklar fazla değildir.

/etc/profile sistem ortam değişkenleridir.

~/.profile kullanıcıya özel ortam değişkenleridir.

"JAVA_HOME değişkenimi nerede ayarlamalıyım?"

  • Birden fazla kullanıcınız var mı? Umurunda mı? Bir kullanıcıyı değiştirerek başka bir kullanıcıyı karıştırır mıydınız /etc/profile?

Genel olarak, tek kullanıcı olmama rağmen sistem genelindeki ayarlarla uğraşmamayı tercih ederim. Yerel ayarlarımı düzenlemeyi tercih ediyorum.


5

GUI uygulamaları için, oluşturmanız ve düzenlemeniz gerekir ~/.MacOSX/environment.plist. Daha fazla ayrıntı burada . Bunların etkili olması için oturumu kapatmanız gerekir. Terminal'den başlatılan uygulamaları da etkileyip etkilemediklerinden emin değilim, ancak olacağını tahmin ediyorum.

Terminal'den başlatılan uygulamalar için ~ / .profile dosyasını da düzenleyebilirsiniz.


2
Evet, Terminal, Terminal'den başlatılan her şey gibi değişkenleri devralır. Sen kullanabilirsiniz RCenvironment değişkenleri korumak için tercih bölümünü.
Gilimanjaro

1
Bu çözüm, artık Mac OS Xv10.7'nin bazı revizyonlarıyla çalışmaz. Mac OS X v10.8 veya üst sürümlerinde herhangi bir düzeltme yapılmaz. Bunun yerine, bkz. Stackoverflow.com/a/4567308/543738
LS

3

Sadece açmak ~/.profileyoluyla, dosyayı nanoTerminalinde ve orada yazın:

export PATH=whatever/you/want:$PATH

Bu dosyayı kaydedin (cmd + X ve Y). Bundan sonra lütfen tekrar oturum açın / oturum açın veya Terminal'de yeni bir sekme açın ve yeni değişkeninizi kullanmayı deneyin.

LÜTFEN / istediğiniz / sonra ": $ PATH" eklemeyi unutmayın, aksi takdirde bundan önce orada olan PATH değişkenindeki tüm yolları sileceksiniz.


4
Bu yalnızca bash komut ortamı için geçerlidir. Burada ayarladığınız değişkenler GUI uygulamaları tarafından görülmez.
Warren P

3

Osx-env-sync ile tek bir kaynaktan komut satırı ve GUI uygulamaları için OS X ortam değişkenlerini senkronize edin .

Burada ilgili bir soruya da yanıt gönderdim .


Bu fantastik. Öneri: launchctl unload / launctl load "refresh now" öğesini bir betiğe koyun. Buna osx-env-sync-now.sh diyorum. Ben .bash_profile benim değişiklik ve küçük "Şimdi yenile" komut dosyasını çalıştırın ve devam. Burada güvenlikle ilgili çıkarımların olduğunu düşünüyorum, bu yüzden bazı sınırlamaların yapılması gerektiğini düşünüyorum. Bu özelliği OS X'te kapatmaları için nedenler olmalı.
Warren P

@WarrenP Yapıldı! Repoyu kontrol edin.
Ersin Er

Mükemmel. Bu benim için çok acıyı çözdü. Bunun gerçekten yararlı olduğu bir durum SCALA ile gelişen herkes içindir. Hem komut satırı scala hem de GUI scala (netbeans gibi) için SCALA_HOME'u ayarlamak aksi halde gerçek bir acıdır.
Warren P

0

MacOS'ta ortam değişkenlerini kalıcı olarak değiştirmek istiyorsanız, bunları ayarlayın /etc/paths. Not , bu dosya salt okunur, varsayılan olarak şunları yapmanız gerekecek böylece chmod yazma izinleri için.


Bu benim için işe yaramıyor. /usr/bin/localBu dosyada var , dosyayı değiştirmeden bile, varsayılan olarak bu şekilde oldu ve yine de GUI uygulamalarım sadece görüyor /usr/bin:/bin:/usr/sbin:/sbin. Birçok kez yeniden başlattım.
mgol

@m_gol Koşarken ne elde edersin cat /etc/paths/?
IgorGanapolsky

1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, ayrı satırlarda. Ve yine de SourceTree birincisi dışında hepsini görüyor.
mgol

" MacOS'ta varsayılan yolu değiştirmek istiyorsanız" olarak düzenlemek isteyebilirsiniz . Bunun çevre değişkenleri ile ilgili daha genel bir sorunla ilgisi yoktur.
rfay

0

2020 Mac OS X Catalina kullanıcıları için:

Diğer yararsız cevapları unutun, burada sadece iki adım gerekli:

  1. Adlandırma kuralına sahip bir dosya oluşturun: öncelik-uygulamaadı. Ardından, eklemek istediğiniz yolu kopyalayıp yapıştırın PATH.

    Örneğin benim durumumda 80-vscodeiçerik var /Applications/Visual Studio Code.app/Contents/Resources/app/bin/.

  2. Bu dosyayı adresine taşıyın /etc/paths.d/. Terminal'de yeni bir sekme (yeni oturum) açmayı ve echo $PATHyolunuzun eklendiğini kontrol etmek için yazmayı unutmayın!

Uyarı: Bu yöntem yalnızca yolunuzu eklerPATH .

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.