OS X'te ortam değişkenlerini ayarlama


849

OS X'te PATH gibi ortam değişkenlerini değiştirmenin uygun yolu nedir?

Google'a biraz baktım ve düzenlemek için üç farklı dosya buldum:

  • / Etc / yolları
  • ~ / .Profile
  • ~ / .Tcshrc

Bu dosyalardan bazılarına bile sahip değilim ve OS X şimdi bash kullandığından .tcshrc'nin yanlış olduğundan eminim . Bu değişkenler, özellikle PATH, nerede tanımlanır?

Koşuyorum OS X v10.5 (Leopard).


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/GUI uygulamasını yeni bir set sistem ortamıyla başlatmak için.
Hong

Yanıtlar:


652

Bruno tam yolunda. Kapsamlı bir araştırma yaptım ve tüm GUI uygulamalarında bulunan değişkenleri ayarlamak istiyorsanız, tek seçeneğiniz /etc/launchd.conf.

Environment.plist'in Spotlight üzerinden başlatılan uygulamalar için çalışmadığını lütfen unutmayın . Bu Steve Sexton tarafından burada belgelenmiştir .

  1. Bir terminal istemi açın

  2. tip sudo vi /etc/launchd.conf (not: bu dosya henüz mevcut olmayabilir)

  3. Aşağıdaki gibi içerikleri dosyaya yerleştirin

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
  4. Vi'deki değişikliklerinizi kaydedin ve Mac'inizi yeniden başlatın. Veya grep/xargs yukarıdaki kod açıklamasında gösterilen komutunu .

  5. Terminal penceresini açıp yazarak değişkenlerinizin çalıştığını kanıtlayın; exportyeni değişkenlerinizi görmelisiniz. Bunlar ayrıca IntelliJ IDEA ve Spotlight üzerinden başlattığınız diğer GUI uygulamalarında da mevcut olacak.


3
Kabul ediyorum cevabının (environment.plist) benim için başarılı olmadığını söylüyorum. Dört makinede 10.5 ve 10.6'da launchd.conf yaklaşımını başarıyla kullandım.
Matthew McCullough

54
Bunu yapmanın bir yolu var mı olmadan bir yapıyor sistemin yeniden başlatılması ?
sorin

40
Yukarıda belirtilen sınırlama MacOS X 10.5 için geçerlidir. Ancak MacOS X 10.6 artık bu sınırlamaya sahip değil ve değerleri çevre içinde ayarlamak. List, spot ışığı ile başlatılan uygulamalar için bile iyi çalışıyor. Bu yüzden seçilen cevap Snow Leopard ;-) için geçerlidir
Louis Jacomet

5
Ayar launchd.confbir yoldur, ancak yeniden başlatılması gerekir (başlatma işlemini yeniden başlatmak için). Yeniden başlatmayı önlemek istiyorsanız, cevabıma bakın stackoverflow.com/questions/135688/…
Matt Curtis

23
Sunulan fırlatma yaklaşımı ile ilgili birkaç sorun var. Çoğu PATH ortam değişkenine özgüdür, ancak asker PATH'den özellikle bahsetmiştir. 1) launchd.conf dosyasındaki öğeler ssh gibi etkileşimli kabuklarda sisteme uygulanmaz. 2) "setenv PATH / testdir" satırının Terminal.app'daki PATH'a eklenmesi, ancak OS X Uygulama Ortamlarındaki diğer tüm PATH öğelerini havaya uçurması. 3) /etc/launchd.conf dosyasında "setenv PATH $ {PATH}: / testdir" yapmak mevcut $ PATH 4'ü düzgün bir şekilde genişletmez) launchd.conf yalnızca bir kullanıcı yerine tüm kullanıcılar için geçerlidir. Daha iyi bir çözüm bulduğum için değil.
NoahR

257

Spotlight tarafından başlatılan yeni işlemler için ortam nasıl ayarlanır (yeniden başlatmaya gerek kalmadan)

Launchd tarafından kullanılan ortamı (ve uzantıyla Spotlight'tan başlayan herhangi bir şeyi) ile ayarlayabilirsiniz launchctl setenv. Örneğin yolu ayarlamak için:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Veya yolunuzu .bashrcveya benzer bir şekilde ayarlamak istiyorsanız , başlatma sırasında yansıtılmasını sağlayın :

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Değiştirilen ortamı almasını istiyorsanız bir uygulamayı yeniden başlatmanız gerekse de yeniden başlatmanıza gerek yoktur .

Bu, Terminal.app altında çalışan kabukları da içerir, ancak oradaysanız ortamı daha doğrudan ayarlayabilirsiniz, örneğin export PATH=/opt/local/bin:/opt/local/sbin:$PATHbash veya zsh için.

Yeniden başlatma sonrasında değişiklikler nasıl korunur

İçin bir yeniden başlatma sonra değişiklikleri tutmak size ortam değişkenleri ayarlayabilirsiniz /etc/launchd.confşöyle:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf yeniden başlattığınızda otomatik olarak yürütülür.

Bu değişikliklerin şimdi geçerli olmasını istiyorsanız, yeniden işlemek için bu komutu kullanmalısınız launchctl.conf(ipucu için teşekkürler mklement!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Daha öğrenebilirsiniz launchctlve nasıl yükleri launchd.confkomutla man launchctl.


2
Çok hoş biri! Ortam.plistini kullanmanın avantajı, OS X'in önce bir terminali ateşlemek zorunda kalmadan bu dosyaların içeriğini onurlandırması gibi görünüyor. Her neyse, bence cevabınız çoğunlukla yeniden başlatma gerekliliğinden kaçınmaya odaklandı, bu yüzden thx.
fotNelton

2
@kapuzineralex Evet, yeniden başlatmayı önler, ayrıca Spotlight'tan başlatılan programların ortamını değiştirir, bu environment.plistda yapılmaz.
Matt Curtis

2
Bu şekilde ortam oluşturmak benim için ancak yeniden başlatılana kadar işe yaradı. Ortam değişkeni, mac'u yeniden başlattıktan sonra sürmedi. Matthew'in yanıtı benim için mükemmel çalıştı.
Shamal Karunarathne

8
@Shamal: Yorumunuzu + 1'ledim, ancak Matthew'in cevabının yeniden başlatılmasını gerektirdiğini , ancak yeniden başlatmadan değiştirmenin doğru yolunu işaret ediyorum. Her ikisini de istiyorsanız, yol ayarlarınızı launchd.conf dosyasına koymanızı öneririm (böylece yeniden başlatmalarda devam ederler) ve daha sonra bu "source /etc/launchctl.conf; launchctl setenv PATH $ PATH" gibi bir komut dosyası kullanmanızı öneririz. ayrıca yeniden başlatmak istemediğinizde "yenileyebilirsiniz".
Matt Curtis

5
@MattCurtis Yeniden başlatma gerekmediğinde, değişikliklerin bir yeniden başlatmadan sonra kaybolacağını açıkça belirtmek için lütfen cevabınızı doğrudan düzenleyebilir misiniz ? Ayrıca, doğru yolu değişiklikleri uygulamak için yeniden başlatma MatthewMcCullough cevabı @ içinde yaklaşımını kullanmak olacaktır önce: . etc/launchd.confegrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl
mklement0

106

OS Xv10.7 (Lion) ' a kadar ve bunları dahil etmek için bunları ayarlayabilirsiniz:

~/.MacOSX/environment.plist

Görmek:

Terminaldeki PATH için, ayarlayabilmeniz .bash_profileveya .profile(muhtemelen oluşturmanız gerekir)

For OS X v10.8 (Dağ Aslanı) ve ötesinde kullanmak gerekmez launchdvelaunchctl .


4
Bu yalnızca grafiksel uygulamalar tarafından kullanılmasını bekliyorsanız geçerlidir. Bunlar genellikle ortam değişkenlerini kullanmadığından, bunları ayarlamak için çok iyi bir yer değildir.
Chris Hanson

18
Ortam değişkenlerini kullanan grafik uygulamaların bazı çok iyi örnekleri var. Örneğin IntelliJ, Maven'in nerede yaşadığını bilmek için M2_HOME'u görebilmeyi sever. Değişkeni görebilmesi için, değişken.plist yerine /etc/launchd.conf içinde ayarlamanız gerekir.
Matthew McCullough

3
Referans için: preferences.plistOS X 10.5 ile kullanmak ideal değildi, çünkü o sırada preferences.plistspot ışıkla başlatılan uygulamalar için okunmadı, Louis tarafından Matthew'in cevabına ve email.esm.psu.edu/pipermail/macosx-emacs/2010-May'a bakınız /002113.html . OS X 10.6 environment.plistiçin olması gerektiği gibi çalışır.
Janus


1
@tim_yates Lütfen doğru olanın ne olduğu göz önüne alındığında, cevabınızın ilk satırını " Lion'a kadar (10 * 7 *) kadar ve dahil olmak üzere) ' yi okuyabilir misiniz? Orijinal, belirsiz "Up to Mountain Lion" için bu düzenleme yapmaya çalıştı ve yorumcular botched.
mklement0

67

Tek bir kaynaktan hem komut satırı hem de GUI uygulamaları için çözüm ( Mac OS Xv10.10 (Yosemite) ve Mac OS Xv10.11 (El Capitan) ile çalışır)

~/.bash_profileAşağıdaki snippet'te sizin gibi ortam değişkeni tanımlarına sahip olduğunuzu varsayalım :

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Bu değişkenleri kullanıcı oturumuna yükleyecek olan her oturum açmada ve istek üzerine her zaman çalışacak bir Başlatma Aracısına ihtiyacımız var . Bu tanımları ayrıştırmak ve aracı tarafından yürütülecek gerekli komutları oluşturmak için bir kabuk komut dosyasına da ihtiyacımız olacak.

Aşağıdaki içeriğe sahip dizinde plistsoneki (örn. Adlı osx-env-sync.plist) bir dosya 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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-lburada parametre kritiktir; kabuk komut dosyasını bir giriş kabuğu ile yürütmek için gereklidir, böylece ~/.bash_profilebu komut dosyası yürütülmeden önce ilk sırada kaynaklanır.

Şimdi, kabuk betiği. ~/.osx-env-sync.shAşağıdaki içeriklerle adresinde oluşturun :

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

Kabuk komut dosyasının yürütülebilir olduğundan emin olun:

chmod +x ~/.osx-env-sync.sh

Şimdi, geçerli oturum için başlatma aracısını yükleyin:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Yeniden) Bir GUI uygulaması başlatın ve ortam değişkenlerini okuyabildiğini doğrulayın.

Kurulum kalıcıdır. Yeniden başlatılır ve yeniden başlar.

İlk kurulumdan sonra (az önce yaptığınız), herhangi bir değişikliği ~/.bash_profileortamınıza tekrar yansıtmak istiyorsanız , launchctl load ...komutu yeniden çalıştırmak istediğiniz şeyi gerçekleştirmez; bunun yerine aşağıdaki gibi bir uyarı alırsınız:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

Oturum kapatma / oturum açma işlemine girmeden ortam değişkenlerinizi yeniden yüklemek için aşağıdakileri yapın:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Son olarak, değişikliklerin farkında olmak için zaten çalışan uygulamalarınızı (Terminal.app dahil) yeniden başlattığınızdan emin olun.

Ayrıca kod ve açıklamaları bir GitHub projesine aktardım : osx-env-sync .

Umarım bu en azından OS X'in (Yosemite ve El Capitan) en son sürümleri için nihai çözüm olacaktır.


Güzel çalışıyor. Bir güvenlik boşluğu olacaksa bu popüler hale geldiyse biraz endişelendi
Warren P

3
Bu çözüm düzgün çalışabildiğim tek çözümdü. Harika çözümler. Neden bu mac üzerinde bu kadar zor olmalı anlayamıyorum ...
JohnyTex

2
Maalesef bu El Capitan'da işe yaramıyor. Github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 sitesinden yaptığınız yorum sorunu iyi açıklıyor.
mgol

1
Bu nedenle, bu çözüm işe yaramaz, /etc/launchd.conf'un bir etkisi yoktur, Node.js ikili dosyasını / usr / local / bin'e yükler ve bu yol GUI uygulamaları için PATH'de değildir. Bu nedenle, Node kullanan Git kancaları, El Capitan'daki SourceTree gibi GUI Git uygulamalarında çalışmaz. Bu korkunç.
mgol

1
Sorun sadece PATH değişkeni ile ilgilidir. Umarım yakında bir çözüm bulabiliriz.
Ersin Er

54
  1. Yapmak:

    vim ~/.bash_profile

    Dosya mevcut olmayabilir (eğer değilse, sadece oluşturabilirsiniz).

  2. Bunu yazın ve dosyayı kaydedin:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Çalıştırmak

    source ~/.bash_profile

+1 export, önerebileceğim şeydi, çünkü BASH desteklemiyorsetenv
vol7ron

Şimdilik çalışıyor. Bütün bunlar düşündüğümden çok daha karmaşık görünüyor. Tüm bunlar için daha fazla zaman ayırmak gerekecek. Teşekkürler.
Ruto Collins

34

OS X'te ortam değişkenleriyle uğraşırken çözülmesi gereken iki sorun vardır. Birincisi, programları Spotlight'tan (Mac menüsünün / durum çubuğunun sağ tarafındaki büyüteç simgesi) çağırırken, ikincisi ise Dock'tan programları çağırırken. . Standart kabuk konumlarından çevreyi okur çünkü bir Terminal uygulamadan programları çağırma / yarar (önemsiz ~/.profile, ~/.bash_profile, ~/.bashrcvs.)

Dock'tan program çağırırken ~/.MacOSX/environment.plist , <dict>öğenin bir dizi öğe içerdiği yerde kullanın <key>KEY</key><string>theValue</string>.

Programları Spotlight'tan çağırırken, launchd'nin ihtiyacınız olan tüm anahtar / değer ayarlarıyla ayarlandığından emin olun.

Her iki sorunu aynı anda çözmek için, Kullanıcı hesabımda bir oturum açma öğesi (Sistem Tercihleri ​​aracıyla ayarlanır) kullanıyorum. Oturum açma öğesi, bir Emacs lisp işlevini çağıran bir bash betiğidir, ancak aynı şeyi gerçekleştirmek için en sevdikleri komut dosyası aracını kullanabilirsiniz. Bu yaklaşımın herhangi bir zamanda çalışması ve yeniden başlatma gerektirmemesi gibi ek bir yararı vardır, yani biri ~/.profileDock veya Spotlight'tan giriş öğesini düzenleyebilir , bazı kabukta çalıştırabilir ve yeni başlatılan programlar için değişikliklere sahip olabilir.

Detaylar:

Giriş öğesi: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Emacs lisp işlevi: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

NOT: Bu çözüm, özellikle Matt Curtis tarafından sunulan, benimkini eklemeden önce gelenlerin bir karışımıdır, ancak ~/.bash_profileiçerik platformumu kasıtlı olarak bağımsız tutmaya ve launchdortamın ayarını (yalnızca Mac tesisi) ayrı bir komut dosyasına koymaya çalıştım. .


20
Vay. Bunun işe yaramayacağını söylemiyorum, ama ... Sadece OS X'te tutarlı bir ortam elde etmek için gereken karmaşıklığa dehşete
kapıldım

2
Bu, 10.9 için gördüğüm tüm çözümlerden en iyi sonucu verir. Tek kusur, giriş öğeleri belirsiz bir sırada çalıştığından, girişte Emacs (örneğin) başlatılırsa (örneğin, oturum kapatıldığında açık olduğu için), yeniden başlatmadığınız sürece ortam değişkenlerine sahip olmayacağıdır. , çünkü senaryonuzdan önce başlatılır.
telotortium

22

Başka bir ücretsiz, açık kaynaklı, Mac OS Xv10.8 (Mountain Lion) Tercih bölmesi / çevre.plist çözümü EnvPane'dir .

EnvPane en kaynak kodu geçerli GitHub'dan . EnvPane, RCEnvironment ile karşılaştırılabilir özelliklere sahip gibi görünüyor , ancak depolanan değişkenlerini anında güncelleyebiliyor gibi görünüyor, yani yeniden başlatma veya oturum açmaya gerek kalmadan hoş geldiniz.

Geliştirici tarafından belirtildiği gibi:

EnvPane, Mac OS X 10.8 (Mountain Lion) için hem grafik hem de terminal oturumlarındaki tüm programlar için ortam değişkenleri ayarlamanızı sağlayan bir tercih bölmesidir. Mountain Lion'daki ~ / .MacOSX / environment.plist desteğini geri yüklemekle kalmaz, aynı zamanda oturumu kapatıp tekrar açmanıza gerek kalmadan çevredeki değişikliklerinizi hemen yayınlar. <SNIP> EnvPane şunları içerir (ve otomatik olarak yükler) 1) girişten sonra erken ve 2) ~ / .MacOSX / environment.plist değiştiğinde çalışan launchd aracısı. Aracı ~ / .MacOSX / environment.plist'i okur ve bu dosyadaki ortam değişkenlerini, launchctl setenv ve launchctl unsetenv tarafından kullanılan aynı API aracılığıyla geçerli kullanıcının launchd örneğine verir.

Feragatname: Hiçbir şekilde geliştirici veya projesi ile ilgili değilim.

PS Adı seviyorum ('Ağrı Bitiyor' gibi geliyor).


2
EnvPane şu anda PATH ayarlayamıyor. Daha fazla ayrıntı için hata raporuma bakın: github.com/hschmidt/EnvPane/issues/5
Uwe Günther

Ben ♥ ️ bu şey .. Sadece dezavantajı .. HERHANGİ bir çözüm kurbanı olacağını düşünüyorum .. - bir süreci yeniden başlatmak zorunda - yeni "çevre" miras. Wonk wonk.
Alex Gray

2
@sorin: GitHub sitesinde yaşadığınız sorunun açıklamasını içeren bir sorun açabilir misiniz? EnvPane benim için 10.10'da çalışıyor. Feragatname: EnvPane'nin yazarıyım.
Hannes

17

Güncelleme (2017-08-04)

(En azından) macOS 10.12.6 (Sierra) itibarıyla bu yöntem Apache httpd için çalışmayı durdurmuş gibi görünmektedir (hem ve systemhem de userseçeneği için launchctl config). Diğer programlar etkilenmiyor gibi görünüyor. Bunun httpd'de bir hata olduğu düşünülebilir.

Orijinal cevap

Bu, OS X 10.10+ ile ilgilidir (özellikle /usr/binartık yazılamayan köksüz mod nedeniyle 10.11+ ).

Değişken launchctl setenv PATH <new path>ayarlamak için kullanarak PATHOS X (ki kişisel deneyim gerçek görünüyor) bir hata nedeniyle çalışmıyor birden çok yerde okudum . Kabuktan başlatılmayan uygulamalarPATH için ayarlanabilecek başka bir yol olduğunu buldum :

sudo launchctl config user path <new path>

Bu seçenek launchctl kılavuz sayfasında belgelenmiştir:

yapılandırma sistemi | kullanıcı parametre değeri

Launchd (8) etki alanları için kalıcı yapılandırma bilgilerini ayarlar. Yalnızca sistem etki alanı ve kullanıcı etki alanları yapılandırılabilir. Kalıcı depolama alanının konumu bir uygulama ayrıntısıdır ve bu depolama birimindeki değişiklikler yalnızca bu alt komutla yapılmalıdır. Bu alt komut aracılığıyla yapılan değişikliklerin yürürlüğe girmesi için yeniden başlatma gerekir.

[...]

yol

Hedef etki alanındaki tüm hizmetler için PATH ortam değişkenini dize değerine ayarlar. Dize değeri environ (7) içindeki PATH ortam değişkeni için belirtilen biçime uygun olmalıdır. Bir hizmet kendi PATH değerini belirtirse, hizmete özel ortam değişkeninin öncelikli olacağını unutmayın.

Not: Bu özellik etki alanındaki tüm hizmetler için genel ortam değişkenleri ayarlamak için kullanılamaz. Güvenlik nedenleriyle kasıtlı olarak PATH ortam değişkenine kadar kapsamlıdır.

Ben Finder ( getenvPATH almak için kullanır ) başlatılan bir GUI uygulaması ile çalışmak için bu onayladı . Bunu yalnızca bir kez yapmanız gerektiğini ve değişikliğin yeniden başlatıldığında kalıcı olacağını unutmayın.


Benim için de işe yarıyor. sudo launchctl procinfo <gui-pid>yeni ayarlanmış PATHortamı gösterir . Ama sudo launchctl config user path <new path>aslında tüm kullanıcılar için ayarlandı ... (yeni kullanıcı ekleyerek ve Sublime
Text'in

1
Bunun, oturum açma sırasında yeniden açılan (kapatıldığında açık olan) uygulamaların PATH ortam değişkeni üzerinde bir etkisi yoktur.
Brecht Machiels

İlginç. Bu, yeniden açılacak uygulamalar için ortamın (veya bir alt kümesinin) kaydedildiği anlamına gelir.
Max Leske

@MaxLeske Hayır, yeniden açılan uygulamalar ortam değişkeni değiştirilmeden önce başlatılır. Yani, bunu yaptıktan sonra sadece ilk kez değil sudo launchctl config user path, bu gerçekleşiyor (ki sanıyorsunuz?).
Brecht Machiels

1
@ShlomiSchwartz launchctlyok değil sen keyfi ortam değişkenlerini ayarlamak için izin verir. PATHDeğişken bir istisnadır.
Max Leske

17

Mountain Lion'da tüm /etc/pathsve /etc/launchd.confdüzenleme herhangi bir etki yaratmaz!

Apple'ın Geliştirici Forumları şunları söylüyor:

Msgstr ".app öğesinin Info.plist'ini, istediğiniz ortam değişkenleriyle" LSEnvironment "sözlüğünü içerecek şekilde değiştirin.

~ / .MacOSX / environment.plist artık desteklenmiyor. "

Bu yüzden doğrudan uygulamanın Info.plist("AppName.app" (bu durumda SourceTree) sağ tıklayın ve sonra " Show package contents") düzenledi .

paket içeriğini göster

Ve yeni bir anahtar / dikte çifti ekledim:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(bkz . Apple'da LaunchServicesKeys Belgeleri )

Resim açıklamasını buraya girin

Şimdi uygulama (benim durumumda Sourcetree) verilen yolu kullanır ve Git 1.9.3 ile çalışır :-)

PS: Elbette Path girişini özel path ihtiyaçlarınıza göre ayarlamanız gerekiyor.


3
Bu çözüm, sisteme en az müdahaleci standardını karşılar. Teşekkürler.
John Vance

@John Vance +1 Tamamen katılıyorum, Jason T. Miller cevabında açıkça açıkladığı gibi sistem çapındaki değişiklikler her zaman riskli
rmcsharry

5
El Capitan'da benim için bir etkisi yok. :(
mgol

High Sierra 10.13 üzerinde, uygulamanın Info.plistdosyasını değiştirirseniz uygulama yüklenemez:LSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
kunjbhai

16

Buradaki yanıtlar "yanlış" olmasa da, bir tane daha ekleyeceğim: OS X'te, belirli bir kullanıcı tarafından etkileşimli olarak çalışan tüm işlemler için "tüm işlemleri" veya hatta kabuğun dışında etkileyen ortam değişkeni değişikliklerini asla yapmayın.

Deneyimlerime göre, tüm işlemler için PATH gibi ortam değişkenlerindeki global değişikliklerin, OS X'te Windows'a göre kırılma olasılığı daha yüksektir. Nedeni, birçok OS X uygulaması ve diğer yazılımlar (belki de özellikle işletim sisteminin kendisinin bileşenleri dahil) kaputun altındaki UNIX komut satırı araçlarına dayanır ve sistemle birlikte sağlanan bu araçların sürümlerinin davranışını varsayar ve mutlaka mutlak yollar kullanmayın (benzer yorumlar dinamik olarak yüklenmiş kütüphaneler ve DYLD_ * ortam değişkenleri için geçerlidir). Örneğin, Python ve Ruby gibi çevirmenlerin OS X tarafından sağlanan sürümlerinin değiştirilmesiyle ilgili çeşitli Stack Overflow sorularına en yüksek puanlı yanıtların genellikle "bunu yapma" dediğini düşünün.

OS X bu bakımdan diğer UNIX benzeri işletim sistemlerinden (ör. Linux, FreeBSD ve Solaris) farklı değildir; Apple'ın bunu yapmanın kolay bir yolunu sağlamamasının en olası nedeni, bir şeyleri kırmasıdır . Windows bu sorunlara yatkın olmadığı ölçüde, iki şeyden kaynaklanmaktadır: (1) Windows yazılımı, UNIX yazılımının yaptığı ölçüde komut satırı araçlarına güvenme eğilimi göstermez ve (2) Microsoft'un sahip olduğu PATH gibi "genel" yapılandırma seçeneklerinin etkisini sınırlamak için daha yeni Windows sürümlerinde dinamik yükleme davranışını değiştirdikleri tüm işlemleri etkileyen değişikliklerin neden olduğu "DLL cehennemi" ve güvenlik sorunlarının bu kadar kapsamlı bir geçmişi.

"Lame" veya değil, bu tür değişiklikleri daha küçük kapsamlarla kısıtlarsanız çok daha kararlı bir sisteminiz olur.


1
İnsanlara nasıl yapmaları gerektiğini sordukları şeyi yapmamalarını söylemek, sordukları soruya bir cevap değildir. İnsanların bunu yapmasını engellemek de bir şeyleri kırıyor. Apple'ın modus operandi.
frabjous

/Applications/App.app/Contents/Info.plist içindeki PATH değerini LSEnvironment key developer.apple.com/library/archive/documentation/General/… ile ayarlamak mevcut önerilen çözüm olabilir.
Dave X

15

Bazen önceki cevapların hepsi işe yaramaz. M2_HOMEEclipse veya IntelliJ IDEA içindeki bir sistem değişkenine (gibi ) erişmek istiyorsanız , bu durumda benim için çalışan tek şey:

Önce (adım 1) /etc/launchd.confaşağıdaki gibi bir satır içerecek şekilde düzenleyin : "setenv VAR değeri" ve sonra (adım 2) yeniden başlatın.

Yalnızca .bash_profile dosyasını değiştirmek işe yaramaz çünkü OS X'te uygulamalar diğer Unix'lerde olduğu gibi başlatılmaz; ebeveynin kabuk değişkenlerini devralmazlar. Diğer tüm değişiklikler, benim bilmediğim bir nedenden dolayı çalışmaz. Belki başka biri bu konuda açıklığa kavuşabilir.


5
Spotlight'tan veya başka herhangi bir yolla başlatılan uygulamaların tümü, /etc/launchd.conf dosyasının üst süreçleri tarafından okunduğundan, ortam değişkenlerinin tüm uygulamalarda ve kabuklarda nerede görüneceği için çekici bir seçimdir.
Matthew McCullough

1
Yeniden başlatmayı önleyen başka bir çözüm için cevabımı görün - stackoverflow.com/questions/135688/…
Matt Curtis

MaxOS 10.6 makinemde /etc/launchd.conf dosyası yok. Bu, bu sürümden itibaren yeni mi yoksa eski mi? Yoksa bu makine berbat mı?
peterk

13

Ortam Değişkenleri tercih bölmesini izledikten sonra ve bağlantının koptuğunu ve Apple'ın sitesinde yapılan bir arama, bunu unuttuklarını gösteriyor gibi göründükten sonra ... Zor fırlatma sürecinin izine geri döndüm.

Sistemimde (Mac OS X 10.6.8) On onu environment.plist tanımlanan bu değişkenleri görünür olan güvenilir (launchd üzerinden) Spotlight başlatılan uygulamalar ihraç ediliyor. Benim sorunum bu vars Terminal yeni bash oturumlarına ihraç edilmiyor olmasıdır. Yani burada tasvir edilen ters problemim var.

NOT: environment.plist, daha önce açıklandığı gibi XML yerine JSON'a benziyor

Ben tarafından vars görmek için Spotlight uygulama almak başardı düzenleme ~ / MacOSX / environment.plist ve benim .profile dosyasına aşağıdaki ekleyerek yeni bir terminal oturumuna aynı değişkenler zorlamak başardı:

eval $(launchctl export)

2
Bu zor değil: RCenvironment
Gilimanjaro

Launchctl ihracatı hakkında güzel bir ipucu. Ama bunu olduğu gibi .profile içine koymak olmaz. $ PATH değerinin üzerine / usr / local / bin içermeyen bir tane yazar. Ancak, ilgilendiğiniz varlıkları seçmek için bir normal ifade kullanabilirsiniz: `` eval $ (launchctl export | grep '^ my. * =').
mivk

3
Yeni Mountain Lion makinemde (10.8.2) çevre. Liste tamamen değersiz. Doğru yol için Matthew'in cevabına bakınız. Her şey /etc/launchd.conf ile birlikte başlatılan ve launchctl komut satırı uygulamasıyla ilgilidir. Sen ile kendine yukarı okuyabilir man launchd, man launchctlve man launchd.confbir terminal penceresinde. Mac Geliştirici Kitaplığı biraz gecikse bile, Glad Apple adam sayfalarını güncel tutar.
Russell B

10

Bash başlangıç dosyalarını Hepsi - ~/.bashrc, ~/.bash_profile, ~/.profile. ~/.MacOSX/environment.plistGUI uygulamalarında ortam değişkenleri için adlandırılan bir çeşit garip dosya da var .


10

Matt Curtis'in verdiği cevaba çok benzer bir şekilde, ortam değişkenlerini launchctl aracılığıyla ayarladım, ancak dışa aktarma adlı bir işleve sarıyorum, böylece .bash_profile'mda normal gibi bir değişkeni dışa aktardığımda, launchctl tarafından da ayarlanır. İşte yaptığım şey:

  1. .Bash_profile'm sadece bir satırdan oluşuyor, (Bu sadece kişisel tercihtir.)

    source .bashrc
  2. Benim .bashrc bu var:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. Yukarıdaki Bash yerleşik "ihracat" aşırı ve her şeyi normal ihracat (onunla "ihracat" ihracat fark edeceksiniz!), Sonra aşağıdakilerden herhangi birini kullanın OSC uygulama ortamları için düzgün şekilde ayarlayın:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. Bu şekilde her değişkeni launchctl'e her seferinde göndermek zorunda değilim ve .bash_profile / .bashrc dosyamı istediğim şekilde ayarlayabilirim. Bir terminal penceresi açın, ilgilendiğiniz ortam değişkenlerini kontrol edinlaunchctl getenv myVar , .bash_profile / .bashrc içindeki bir şeyi değiştirin, terminal penceresini kapatın ve tekrar açın, launchctl ve voilá ile değişkeni tekrar kontrol edin, değişti.

  5. Yine, Mountain Lion sonrası dünyasının diğer çözümleri gibi, uygulamalar için yeni ortam değişkenlerinin kullanılabilmesi için, değişiklikten sonra bunları başlatmanız veya yeniden başlatmanız gerekir.


1
Yararlı cevap - teşekkürler. Orijinal çözümünüz ayarladığınız ortam değişkeninin değerinin işaretlere eşit olduğu durumları ele almadığı için yeni güncelledim (örn., CXX_FLAGS = "- mmacosx-version-min = 10.9"
Steve Broberg

@SteveBroberg - sadece bir karakter değişikliği, sed'e ihtiyaç duymadan Bash regexp'ini düzeltir! (Beni yanlış anlamayın,
sed'i

1
Daha iyi bir yol olması gerektiğini düşündüm, ama ben bir bash gurusu değilim ve %%, ##, vb. Google'a gidemedim.
Steve Broberg

10

İşte istediğinizi yapmanın çok basit bir yolu. Benim durumumda, Gradle'ı işe alıyordu (Android Studio için).

  • Terminal'i açın.
  • Aşağıdaki komutu çalıştırın:

    sudo nano /etc/paths veya sudo vim /etc/paths

  • İstendiğinde şifrenizi girin.

  • Dosyanın altına gidin ve eklemek istediğiniz yolu girin.
  • Hit Control+ Xçıkmak için.
  • Değiştirilen arabelleği kaydetmek için 'Y' girin.
  • Yeni bir terminal penceresi açın ve şunu yazın:

    echo $PATH

Yeni yolun PATH sonuna eklenmiş olduğunu görmelisiniz.

Bu yayından şu ayrıntıları aldım:

Mac OS X 10.8 Mountain Lion ve sonraki sürümlerde PATH'e ekleyin



7

Her dosyanın neye yönelik olduğu konusunda açık ve net olmak

  • ~/.profile Terminal.app her başlatıldığında kaynaklanır
  • ~/.bashrc Bash ortamına yönelik tüm ihracat bildirimlerinin "geleneksel olarak" ayarlandığı yerdir
  • /etc/paths Mac OS'de tüm kullanıcılar için PATH ortam değişkenini oluşturmak için varsayılan yolların listesini içeren ana dosyadır
  • /etc/paths.d/ ek arama yollarına sahip dosyalar içeriyor

Terminal olmayan programlar, terminalinizin yaptığı sistem çapında PATH ve MANPATH değişkenlerini devralmaz! Belirli bir kullanıcı tarafından başlatılan tüm işlemler için ortam ayarlamak ve böylece ortam değişkenlerini Mac OS X GUI uygulamaları için kullanılabilir hale getirmek için, bu değişkenlerin ~/.MacOSX/environment.plist(Apple Technical Q&A QA1067)

Şu Verilerinizi eşitlemek için aşağıdaki komut satırını kullanın environment.plistile /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"

6

/etc/launchd.conf, OS Xv10.10 (Yosemite), OS Xv10.11 (El Capitan), macOS v10.12 (Sierra) veya macOS v10.13'te (Yüksek Sierra) kullanılmaz.


Gönderen launchctladam sayfası:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Bu Farklı Sorma yanıtında açıklanan yöntem benim için (yeniden başlattıktan sonra) çalışır: Dock'tan veya Spotlight'tan başlatılan uygulamalar, ayarladığım ortam değişkenlerini devralır ~/Library/LaunchAgents/my.startup.plist. (Benim durumumda, bir Yüce Metin eklentisi LANGiçin en_US.UTF-8, ayarlamam gerekiyordu .)


Yeniden başlatma sırasında, son oturumdan uygulamalar yeniden başlatılmadan önce my.startup.plist'in yüklenmesini sağlayan bir yükleme sırası var mı?
kunjbhai


3

Basit:

~ / .Profile dosyasını düzenleyin ve değişkenlerinizi aşağıdaki gibi yerleştirin

$ vim ~ / .profile

Dosya koyma:

MY_ENV_VAR = değer

  1. Kaydet (: wq)

  2. Terminali yeniden başlatın (Çıkın ve tekrar açın)

  3. Hepsinin iyi olduğundan emin olun:

$ echo $ MY_ENV_VAR

$ değer



3

Tek bir kullanıcı değişikliği ~/.profileiçin listelediklerinizi kullanın. Aşağıdaki bağlantı, farklı dosyaların Bash tarafından ne zaman okunduğunu açıklar.

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

Gui uygulamaları için ortam değişkenini ayarlamak isterseniz, ~ / .MacOSX / environment.plist dosyasına ihtiyacınız vardır.


3

/etc/pathsVe ~/.MacOSX/environment.plistdosyalardan emin değilim . Bunlar yeni.

Ancak Bash .bashrcile bunun her yeni kabuk çağrısıyla .bash_profileyürütüldüğünü ve başlangıçta yalnızca bir kez yürütüldüğünü bilmelisiniz .

Bunun Mac OS X ile ne sıklıkta olduğunu bilmiyorum. Sanırım ayrım her şeyi başlatan pencere sistemi ile bozuldu.

Şahsen, .bashrcihtiyacım olan her şeyi içeren bir dosya oluşturarak karışıklığı ortadan kaldırıyorum ve sonra yapıyorum:

ln -s .bashrc .bash_profile

3

Önerilen yaklaşımlara ek olarak dikkat edilmesi gereken bir nokta, en azından OS X 10.5'te (Leopard), ayarlanan değişkenlerin launchd.confyapılan ayarlarla birleştirileceğidir .profile. Bunun muhtemelen ayarlar için de geçerli olacağını ~/.MacOSX/environment.plistdüşünüyorum, ancak doğrulamamıştım.


3

Mac OS'de PATH ortam değişkeninizi ayarlama

Terminal programını açın (varsayılan olarak Uygulamalar / Yardımcı Programlar klasörünüzde bulunur). Aşağıdaki komutu çalıştırın

touch ~/.bash_profile; open ~/.bash_profile

Bu, dosyayı varsayılan metin düzenleyicinizde açar.

Android SDK için örnek olarak:

Android SDK platform araçları ve araçlar dizininize yolu eklemeniz gerekir. Örneğimde SDK'nın kurulu olduğu dizin olarak "/ Development / android-sdk-macosx" kullanacağım. Aşağıdaki satırı ekleyin:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Dosyayı kaydedin ve metin düzenleyicisinden çıkın. PATH'inizi güncellemek için .bash_profile dosyanızı yürütün:

source ~/.bash_profile

Şimdi Terminal programını her açtığınızda PATH'niz Android SDK'sını içerecektir.


3

Sadece bu gerçekten kolay ve hızlı yaptı. İlk önce terminalden bir ~ / .bash_profile oluşturun :

touch .bash_profile

sonra

open -a TextEdit.app .bash_profile

Ekle

export TOMCAT_HOME=/Library/Tomcat/Home

belgelerinizi kaydedin ve işiniz bitti.


Mükemmel. JAVA_HOME için adımları izledim, Sadece ihracat JAVA_HOME = / Kütüphane / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / İçindekiler / Ev ve gerçek hızlı başarı eklendi!
NarendraC

Harika @NarendraC!
CodeOverRide

2

Oldukça basit. Dosya düzenleme .profile(vi, nano , Sublime Text veya başka bir metin düzenleyici) dosyası. Sen buldum olabilir ~/böyle dizine (kullanıcı dizini) ve seti:

export MY_VAR=[your value here]

Java home ile örnek:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Kaydet ve terminale geri dön.

Şunlarla yeniden yükleyebilirsiniz:

source .profile

Veya terminal pencerenizi kapatıp açın.


2

Burada iki tür mermi oynuyor.

  • Giriş yapılmaz: .bashrc, Bash'in her yeni kopyasını başlattığınızda yeniden yüklenir
  • Oturum Açma: .profile yalnızca oturum açtığınızda veya Bash'e yüklemesini ve oturum açma kabuğu olarak kullanmasını açıkça söylediğinizde yüklenir.

Bu Bash ile, dosya burada anlamak önemlidir .bashrctek interaktif olmayan giriş ikisi de bir kabuk tarafından okunur ve o insanlar genellikle yük bulacaksınız .bashrciçinde .bash_profilebu sınırlamayı aşmak için.

Artık temel bir anlayışa sahip olduğunuza göre, bunu ayarlamanızı nasıl tavsiye edeceğimize geçelim.

  • .profile: mevcut olmayan oluşturun. PATH kurulumunuzu oraya koyun.
  • .bashrc: yoksa oluşturun. Tüm takma adlarınızı ve özel yöntemlerinizi oraya koyun.
  • .bash_profile: yoksa oluşturun. Şunu buraya koy.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

2

Giriş Kabukları

/etc/profile

Kabuk ilk önce dosyadaki komutları yürütür /etc/profile. Kök ayrıcalıklarıyla çalışan bir kullanıcı, bu dosyayı Bash çalıştıran kullanıcılar için sistem genelinde varsayılan özellikler oluşturacak şekilde ayarlayabilir.

.bash_profile
.bash_login
.profile

İçin kabuk görünüyor Sonraki ~/.bash_profile, ~/.bash_loginve ~/.profilebulduğu bu dosyaların ilk komutları çalıştırarak, bu sırayla, (~ / ev dizini için kısa eldir). Ayarlanan varsayılanları geçersiz kılmak için bu dosyalardan birine komutlar koyabilirsiniz /etc/profile. Sanal terminalde çalışan bir kabuk, bu dosyalarda komut yürütmez.

.bash_logout

Oturumu kapattığınızda, bash ~/.bash_logoutdosyadaki komutları yürütür . Bu dosya genellikle bir oturumdan sonra, geçici dosyaları kaldıranlar gibi temizleyen komutları tutar.

İnteraktif Girişsiz Kabuklar

/etc/bashrc

Doğrudan bash tarafından çağrılmasa da, birçok ~/.bashrcdosya çağırır /etc/bashrc. Bu kurulum, kök ayrıcalıklarıyla çalışan bir kullanıcının, oturum açmamış bash kabukları için sistem çapında varsayılan özellikler oluşturmasına olanak tanır.

.bashrc

Etkileşimli oturum açma kabuğu dosyadaki komutları yürütür ~/.bashrc. Genellikle bir oturum açma kabuğu için bir başlangıç ​​dosyası .bash_profile, bu dosyayı çalıştırır, bu nedenle hem oturum açma hem de oturum açma olmayan kabuklar komutları çalıştırır .bashrc.

İçindeki komutlar .bashrcbirçok kez yürütülebildiğinden ve alt kabuklar dışa aktarılan değişkenleri devraldığından, .bash_profiledosyadaki varolan değişkenlere eklenen komutları koymak iyi bir fikirdir .


2

İOS'taki tüm sihir, yalnızca sourceortam değişkenlerinizi dışa aktardığınız dosyayla birlikte kullanılır .

Örneğin:

Bunun gibi bir dosya oluşturabilirsiniz:

export bim=fooo
export bom=bar

Bu dosyayı farklı kaydedin bimbom.envve yapın source ./bimbom.ev. Voilá, ortam değişkenlerin var.

Bunları kontrol edin:

echo $bim

1

Bash için, ortam değişkenlerinizi /etc/profiletüm kullanıcılar için kullanılabilir hale getirmek üzere dosyaya eklemeyi deneyin . Yeniden başlatmaya gerek yok, sadece yeni bir Terminal oturumu başlatın.

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.