Mengatur variabel lingkungan pada OS X

849

Apa cara yang tepat untuk memodifikasi variabel lingkungan seperti PATH di OS X?

Saya telah mencari di Google sedikit dan menemukan tiga file berbeda untuk diedit:

  • / etc / paths
  • ~ /. profil
  • ~ / .tcshrc

Saya bahkan tidak memiliki beberapa file ini, dan saya cukup yakin bahwa .tcshrc salah, karena OS X menggunakan bash sekarang. Di mana variabel-variabel ini, terutama PATH, didefinisikan?

saya sedang berlari OS X v10.5 (Leopard).

Paul Wicks
sumber
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/untuk meluncurkan aplikasi GUI dengan lingkungan sistem set yang baru.
Hong

Jawaban:

652

Bruno tepat di jalurnya. Saya telah melakukan penelitian ekstensif dan jika Anda ingin mengatur variabel yang tersedia di semua aplikasi GUI, satu-satunya pilihan Anda adalah /etc/launchd.conf.

Harap perhatikan bahwa environment.plist tidak berfungsi untuk aplikasi yang diluncurkan melalui Spotlight. Ini didokumentasikan oleh Steve Sexton di sini .

  1. Buka terminal prompt

  2. Ketik sudo vi /etc/launchd.conf(catatan: file ini mungkin belum ada)

  3. Masukkan konten seperti berikut ke dalam file

    # 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. Simpan perubahan Anda di vi dan reboot Mac Anda. Atau gunakan perintah grep/ xargsyang ditunjukkan dalam kode komentar di atas.

  5. Buktikan bahwa variabel Anda bekerja dengan membuka jendela Terminal dan mengetik exportdan Anda akan melihat variabel baru Anda. Ini juga akan tersedia di IntelliJ IDEA dan aplikasi GUI lain yang Anda luncurkan melalui Spotlight.

Matthew McCullough
sumber
3
Saya mengatakan bahwa jawaban yang diterima (environment.plist) belum berhasil bagi saya. Saya telah berhasil menggunakan pendekatan launchd.conf pada 10.5 dan 10.6 pada empat mesin.
Matthew McCullough
54
Apakah ada cara untuk melakukan ini tanpa melakukan reboot sistem ?
sorin
40
Batasan yang disebutkan di atas berlaku untuk MacOS X 10.5. Namun MacOS X 10.6 tidak memiliki batasan ini lagi dan mengatur nilai-nilai di dalam environment.plist berfungsi dengan baik bahkan untuk aplikasi yang diluncurkan melalui sorotan. Jadi jawaban yang dipilih benar untuk Snow Leopard ;-)
Louis Jacomet
5
Pengaturan launchd.confadalah satu cara, tetapi membutuhkan reboot (untuk memulai ulang launchd). Jika Anda ingin menghindari reboot, lihat jawaban saya stackoverflow.com/questions/135688/…
Matt Curtis
23
Ada beberapa masalah dengan pendekatan launchd yang disajikan. Sebagian besar khusus untuk variabel lingkungan PATH, tetapi penanya memang menyebutkan PATH secara khusus. 1) item dalam launchd.conf tidak bisa diterapkan dalam shell interaktif seperti ssh ke dalam sistem. 2) memiliki baris "setenv PATH / testdir" ditambahkan ke PATH di Terminal.app, tetapi menghapus semua item PATH lainnya di Lingkungan Aplikasi OS X. 3) Melakukan "setenv PATH $ {PATH}: / testdir" di /etc/launchd.conf tidak memperluas dengan benar $ PATH 4 yang ada) launchd.conf berlaku untuk semua pengguna, bukan hanya satu. Bukannya aku punya soln yang lebih baik.
NoahR
257

Cara mengatur lingkungan untuk proses baru yang dimulai oleh Spotlight (tanpa perlu reboot)

Anda dapat mengatur lingkungan yang digunakan oleh launchd (dan, dengan ekstensi, apa pun yang dimulai dari Spotlight) dengan launchctl setenv. Misalnya untuk mengatur jalur:

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

Atau jika Anda ingin mengatur jalur Anda .bashrcatau sejenisnya, maka dicerminkan di launchd:

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

Tidak perlu melakukan reboot meskipun Anda harus me-restart aplikasi jika Anda ingin mengambil lingkungan yang berubah.

Ini termasuk semua shell yang sudah berjalan di bawah Terminal.app, meskipun jika Anda di sana Anda dapat mengatur lingkungan lebih langsung, misalnya dengan export PATH=/opt/local/bin:/opt/local/sbin:$PATHuntuk bash atau zsh.

Cara menjaga perubahan setelah reboot

Untuk menjaga perubahan setelah reboot, Anda dapat mengatur variabel lingkungan /etc/launchd.conf, seperti:

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

launchd.conf dijalankan secara otomatis ketika Anda reboot.

Jika Anda ingin perubahan ini diterapkan sekarang, Anda harus menggunakan perintah ini untuk diproses ulang launchctl.conf(terima kasih @mklement atas tipnya!)

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

Anda dapat menemukan lebih banyak tentang launchctldan bagaimana memuat launchd.confdengan perintah man launchctl.

Matt Curtis
sumber
2
Sangat bagus! Keuntungan menggunakan environment.plist tampaknya adalah OS X menghargai konten file-file tersebut tanpa harus menyalakan terminal terlebih dahulu. Lagi pula, saya pikir jawaban Anda terutama berkonsentrasi pada menghindari perlunya reboot, jadi terima kasih.
fotNelton
2
@kapuzineralex Ya itu menghindari reboot, juga mengubah lingkungan untuk program yang dimulai dari Spotlight, yang environment.plisttidak melakukannya.
Matt Curtis
2
Pengaturan lingkungan dengan cara ini hanya bekerja untuk saya sampai saya reboot. Variabel lingkungan tidak bertahan setelah saya reboot mac. Jawaban Matthew bekerja sempurna untukku.
Shamal Karunarathne
8
@Shamal: Saya memberi +1 pada komentar Anda tetapi ingat bahwa jawaban Matthew membutuhkan reboot, sedangkan saya menunjukkan cara yang benar untuk mengubahnya tanpa reboot. Jika Anda menginginkan keduanya, saya sarankan Anda meletakkan pengaturan jalur Anda di launchd.conf (sehingga mereka tetap di seluruh reboot), dan kemudian menggunakan skrip dengan sesuatu seperti ini "source /etc/launchctl.conf; launchctl setenv PATH $ PATH", jadi Anda juga dapat "menyegarkan" ketika Anda tidak ingin memulai ulang.
Matt Curtis
5
@MattCurtis Bisakah Anda mengedit jawaban Anda secara langsung untuk memperjelas bahwa sementara tidak ada reboot yang diperlukan, perubahan sebenarnya akan hilang setelah reboot? Juga, cara yang benar untuk menerapkan perubahan etc/launchd.confsebelum reboot akan menggunakan pendekatan di @ jawaban MatthewMcCullough ini: egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl.
mklement0
106

Hingga dan termasuk OS X v10.7 (Lion) Anda dapat mengaturnya di:

~/.MacOSX/environment.plist

Lihat:

Untuk PATH di Terminal, Anda harus dapat mengatur .bash_profileatau .profile(Anda mungkin harus membuatnya)

Untuk OS X v10.8 (Singa Gunung) dan selanjutnya Anda harus menggunakan launchddanlaunchctl .

tim_yates
sumber
4
Ini hanya jika Anda benar-benar mengharapkannya untuk digunakan oleh aplikasi grafis. Karena ini biasanya tidak menggunakan variabel lingkungan, itu bukan tempat yang sangat baik untuk mengaturnya.
Chris Hanson
18
Ada beberapa contoh aplikasi grafis yang sangat bagus yang menggunakan variabel lingkungan. IntelliJ misalnya, suka melihat M2_HOME untuk mengetahui di mana Maven tinggal. Untuk membuatnya melihat variabel, Anda harus mengaturnya di /etc/launchd.conf alih-alih environment.plist.
Matthew McCullough
3
Untuk referensi: menggunakan preferences.plistkurang dari ideal dengan OS X 10.5 karena pada saat preferences.plistitu tidak dibaca untuk aplikasi yang diluncurkan melalui sorotan, lihat komentar oleh Louis untuk jawaban Matthew dan email.esm.psu.edu/pipermail/macosx-emacs/2010-May /002113.html . Untuk OS X 10.6 environment.plistberfungsi seperti seharusnya.
Janus
16
Ini tidak lagi berlaku untuk OSX 10,8 apple.stackexchange.com/questions/57385/...
thatsmydoing
1
@tim_yates Bisakah Anda mengedit baris pertama dari jawaban Anda untuk membaca "Hingga dan termasuk Lion (10. * 7 *)", mengingat bahwa itu yang benar? Saya mencoba untuk menyunting itu menjadi "Ambang Ke Singa Gunung" yang asli dan ambigu, dan pengulas mengacaukannya.
mklement0
67

Solusi untuk baris perintah dan aplikasi GUI dari satu sumber (bekerja dengan Mac OS X v10.10 (Yosemite) dan Mac OS X v10.11 (El Capitan))

Mari kita asumsikan Anda memiliki definisi variabel lingkungan di ~/.bash_profilesuka Anda di cuplikan berikut:

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"

Kami membutuhkan Agen Peluncuran yang akan berjalan pada setiap login dan kapan saja berdasarkan permintaan yang akan memuat variabel-variabel ini ke sesi pengguna. Kami juga membutuhkan skrip shell untuk menguraikan definisi ini dan membuat perintah yang diperlukan untuk dieksekusi oleh agen.

Buat file dengan plistakhiran (misalnya bernama osx-env-sync.plist) dalam ~/Library/LaunchAgents/direktori dengan konten berikut:

<?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>

-lparameter sangat penting di sini; itu diperlukan untuk mengeksekusi skrip shell dengan shell login sehingga ~/.bash_profilebersumber di tempat pertama sebelum skrip ini dijalankan.

Sekarang, skrip shell. Buat ~/.osx-env-sync.shdengan isi berikut:

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

Pastikan skrip shell dapat dieksekusi:

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

Sekarang, muat agen peluncuran untuk sesi saat ini:

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

(Re) Luncurkan aplikasi GUI dan verifikasi bahwa itu dapat membaca variabel lingkungan.

Penyiapannya gigih. Itu akan bertahan hidup restart dan kembali.

Setelah pengaturan awal (yang baru saja Anda lakukan), jika Anda ingin mencerminkan perubahan apa pun di ~/.bash_profile seluruh lingkungan Anda lagi, jalankan kembali launchctl load ...perintah tidak akan melakukan apa yang Anda inginkan; sebagai gantinya Anda akan mendapatkan peringatan seperti berikut:

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

Untuk memuat ulang variabel lingkungan Anda tanpa melalui proses logout / login lakukan hal berikut:

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

Akhirnya pastikan Anda meluncurkan kembali aplikasi yang sudah berjalan (termasuk Terminal.app) untuk membuat mereka mengetahui perubahan.

Saya juga mendorong kode dan penjelasannya di sini ke proyek GitHub: osx-env-sync .

Saya harap ini akan menjadi solusi akhir, setidaknya untuk versi terbaru OS X (Yosemite & El Capitan).

Ersin Er
sumber
Bekerja dengan baik. Sedikit khawatir jika ini menjadi populer jika itu akan menjadi celah keamanan
Warren P
3
Solusi ini adalah satu-satunya yang saya dapat bekerja dengan baik. Solusi hebat. Saya tidak mengerti mengapa ini harus begitu sulit di mac ...
JohnyTex
2
Sayangnya, ini tidak berhasil pada El Capitan. Komentar Anda dari github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 menjelaskan masalahnya dengan baik.
mgol
1
Jadi, solusi ini tidak berfungsi, /etc/launchd.conf tidak berpengaruh, Node.js menginstal binernya ke / usr / local / bin dan lintasan ini tidak di PATH untuk aplikasi GUI. Oleh karena itu, kait Git menggunakan Node tidak berfungsi di aplikasi GUI Git seperti SourceTree sama sekali di El Capitan. Ini mengerikan.
mgol
1
Masalahnya hanya tentang variabel PATH. Saya harap kita dapat menemukan solusinya segera.
Ersin Er
54
  1. Melakukan:

    vim ~/.bash_profile

    File mungkin tidak ada (jika tidak, Anda bisa membuatnya).

  2. Ketik ini dan simpan file:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Lari

    source ~/.bash_profile
WoooHaaaa
sumber
+1 exportadalah apa yang akan saya sarankan, karena BASH tidak mendukungsetenv
vol7ron
Bekerja untuk sekarang. Semua ini terlihat jauh lebih rumit dari yang saya kira. Harus mendedikasikan lebih banyak waktu untuk semua ini nanti. Terima kasih.
Ruto Collins
34

Pada dasarnya ada dua masalah yang harus dipecahkan ketika berhadapan dengan variabel lingkungan di OS X. Yang pertama adalah ketika menjalankan program dari Spotlight (ikon kaca pembesar di sisi kanan menu Mac / bilah status) dan yang kedua saat menjalankan program dari Dock . Menjalankan program dari aplikasi / utilitas Terminal adalah sepele karena membaca lingkungan dari lokasi shell standar ( ~/.profile,~/.bash_profile ,~/.bashrc , dll)

Saat menjalankan program dari Dock, gunakan ~/.MacOSX/environment.plist tempat<dict> elemen berisi urutan <key>KEY</key><string>theValue</string> elemen.

Saat menjalankan program dari Spotlight, pastikan launchd telah diatur dengan semua pengaturan kunci / nilai yang Anda butuhkan.

Untuk menyelesaikan kedua masalah secara bersamaan, saya menggunakan item login (ditetapkan melalui alat System Preferences) pada akun Pengguna saya. Item login adalah skrip bash yang menjalankan fungsi lisp Emacs meskipun tentu saja orang dapat menggunakan alat skrip favorit mereka untuk mencapai hal yang sama. Pendekatan ini memiliki manfaat tambahan yang berfungsi setiap saat dan tidak memerlukan reboot, yaitu orang dapat mengedit~/.profile , menjalankan item login di beberapa shell dan memiliki perubahan yang terlihat untuk program yang baru dipanggil, baik dari Dock atau Spotlight.

Detail:

Item masuk: ~/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"

Fungsi lisp Emacs: ~/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)))

CATATAN: Solusi ini adalah campuran dari mereka yang datang sebelum saya menambahkan milik saya, terutama yang ditawarkan oleh Matt Curtis, tetapi saya sengaja mencoba untuk menjaga ~/.bash_profileplatform konten saya independen dan menempatkan pengaturan launchdlingkungan (fasilitas Mac hanya) ke dalam skrip terpisah .

piyama0
sumber
20
Wow. Saya tidak mengatakan ini tidak akan berhasil, tapi ... Saya hanya terkejut dengan kompleksitas yang diperlukan untuk mendapatkan lingkungan yang konsisten pada OS X.
offby1
2
Ini yang terbaik dari semua solusi yang pernah saya lihat untuk 10.9. Satu-satunya kelemahan adalah bahwa, karena item login berjalan dalam urutan yang tidak ditentukan, jika Emacs (misalnya) diluncurkan pada saat login (karena terbuka saat logout, misalnya), item login tidak harus memiliki variabel lingkungan kecuali Anda me-restart itu , karena diluncurkan sebelum skrip Anda.
telotortium
22

Solusi preferensi lain, gratis, opensource, Mac OS X v10.8 (Mountain Lion) panel / environment.plist adalah EnvPane .

Kode sumber EnvPane tersedia di GitHub . EnvPane sepertinya memiliki fitur yang sebanding dengan RCEnvironment , namun, tampaknya ia dapat memperbarui variabel yang tersimpan secara instan, yaitu tanpa perlu memulai ulang atau masuk, yang disambut baik.

Seperti yang dinyatakan oleh pengembang:

EnvPane adalah panel preferensi untuk Mac OS X 10.8 (Mountain Lion) yang memungkinkan Anda mengatur variabel lingkungan untuk semua program dalam sesi grafik dan terminal. Tidak hanya mengembalikan dukungan untuk ~ / .MacOSX / environment.plist di Mountain Lion, itu juga menerbitkan perubahan Anda ke lingkungan dengan segera, tanpa perlu logout dan kembali. <SNIP> EnvPane termasuk (dan secara otomatis menginstal) a launchd agent yang berjalan 1) lebih awal setelah login dan 2) kapan saja ~ / .MacOSX / environment.plist berubah. Agen membaca ~ / .MacOSX / environment.plist dan mengekspor variabel lingkungan dari file tersebut ke instance launchd pengguna saat ini melalui API yang sama yang digunakan oleh launchctl setenv dan launchctl unsetenv.

Penafian: Saya sama sekali tidak terkait dengan pengembang atau proyeknya.

PS Saya suka namanya (terdengar seperti 'Berakhir Nyeri').

Kaya Besar
sumber
2
EnvPane tidak dapat mengatur PATH saat ini. Untuk lebih jelasnya lihat laporan bug saya: github.com/hschmidt/EnvPane/issues/5
Uwe Günther
Saya ♥ ️ hal ini .. Hanya kekurangannya .. yang saya pikir solusi APAPUN akan menjadi korban .. adalah - harus memulai kembali proses - untuk mewarisi "lingkungan" baru. Wonk wonk.
Alex Gray
2
@sorin: Bisakah Anda membuka masalah di situs GitHub dengan deskripsi masalah yang Anda alami? EnvPane bekerja untuk saya di 10.10. Penafian: Saya penulis EnvPane.
Hannes
17

Pembaruan (2017-08-04)

Pada (setidaknya) MacOS 10.12.6 (Sierra) metode ini tampaknya telah berhenti bekerja untuk Apache httpd (untuk kedua systemdan userpilihanlaunchctl config ). Program-program lain tampaknya tidak terpengaruh. Bisa dibayangkan bahwa ini adalah bug di httpd.

Jawaban asli

Ini menyangkut OS X 10.10+ (10.11+ khusus karena mode rootless mana /usr/bin tidak lagi dapat ditulisi).

Saya telah membaca di banyak tempat yang menggunakan launchctl setenv PATH <new path>untuk mengatur PATHvariabel tidak berfungsi karena bug di OS X (yang tampaknya benar dari pengalaman pribadi). Saya menemukan bahwa ada cara lain yang PATHdapat diatur untuk aplikasi yang tidak diluncurkan dari shell :

sudo launchctl config user path <new path>

Opsi ini didokumentasikan di halaman manual launchctl:

sistem konfigurasi | nilai parameter pengguna

Menetapkan informasi konfigurasi persisten untuk launchd (8) domain. Hanya domain sistem dan domain pengguna yang dapat dikonfigurasi. Lokasi penyimpanan persisten adalah detail implementasi, dan perubahan pada penyimpanan itu hanya boleh dilakukan melalui sub-perintah ini. Diperlukan reboot untuk perubahan yang dilakukan melalui sub-perintah ini agar berlaku.

[...]

jalan

Setel variabel lingkungan PATH untuk semua layanan dalam domain target ke nilai string. Nilai string harus sesuai dengan format yang diuraikan untuk variabel lingkungan PATH di lingkungan (7). Perhatikan bahwa jika suatu layanan menentukan PATH-nya sendiri, variabel lingkungan spesifik-layanan akan diutamakan.

CATATAN: Fasilitas ini tidak dapat digunakan untuk mengatur variabel lingkungan umum untuk semua layanan dalam domain. Ini sengaja dicakup untuk lingkungan PATH yang bervariasi dan tidak ada yang lain untuk alasan keamanan.

Saya telah mengkonfirmasi ini untuk bekerja dengan aplikasi GUI mulai dari Finder (yang digunakan getenvuntuk mendapatkan PATH). Perhatikan bahwa Anda hanya perlu melakukan ini satu kali dan perubahan akan tetap ada melalui reboot.

Max Leske
sumber
Ini juga bekerja untuk saya. sudo launchctl procinfo <gui-pid>menunjukkan PATHlingkungan yang baru ditetapkan . Namun sudo launchctl config user path <new path>sebenarnya disetel untuk semua pengguna ... (dikonfirmasi dengan menambahkan pengguna baru & menggunakan konsol python Sublime Text)
Bossliaw
1
Ini tampaknya tidak berpengaruh pada variabel lingkungan PATH dari aplikasi yang dibuka kembali saat login (yang terbuka saat dimatikan).
Brecht Machiels
Menarik. Itu berarti bahwa untuk aplikasi yang akan dibuka kembali lingkungan (atau bagian daripadanya) sedang disimpan.
Max Leske
@ MaxLeske Tidak, aplikasi yang dibuka kembali sedang dimulai sebelum variabel lingkungan diubah. Jadi, ini bukan hanya pertama kalinya setelah melakukan sudo launchctl config user path, bahwa ini terjadi (yang Anda anggap sebagai asumsi?).
Brecht Machiels
1
@ShlomiSchwartz launchctltidak tidak memungkinkan Anda untuk mengatur variabel lingkungan sewenang-wenang. The PATHvariabel adalah pengecualian.
Max Leske
17

Di Gunung Singa semua /etc/pathsdan/etc/launchd.conf pengeditan tidak memberikan efek apa pun!

Forum Pengembang Apple mengatakan:

"Ubah daftar Info.pl. Aplikasi itu sendiri untuk berisi kamus" LSEnvironment "dengan variabel lingkungan yang Anda inginkan.

~ / .MacOSX / environment.plist tidak lagi didukung. "

Jadi saya langsung mengedit aplikasi Info.plist(klik kanan pada "AppName.app" (dalam hal ini SourceTree) dan kemudian " Show package contents").

Tampilkan Isi Paket

Dan saya menambahkan pasangan kunci / dikte baru bernama:

<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>

(lihat: Dokumentasi LaunchServicesKeys di Apple )

Masukkan deskripsi gambar di sini

Sekarang aplikasi (dalam kasus saya Sourcetree) menggunakan path yang diberikan dan bekerja dengan Git 1.9.3 :-)

PS: Tentu saja Anda harus menyesuaikan entri Path dengan kebutuhan path spesifik Anda.

Flori
sumber
3
Solusi ini memenuhi standar paling tidak mengganggu pada sistem. Terima kasih.
John Vance
@ John Vance +1 Sepenuhnya setuju, perubahan di seluruh sistem selalu berisiko karena Jason T. Miller menjelaskan dengan jelas dalam jawabannya
rmcsharry
5
Tidak ada pengaruhnya bagi saya di El Capitan. :(
mgol
Pada High Sierra 10.13, jika saya memodifikasi Info.plistfile aplikasi maka aplikasi gagal dimuat:LSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
kunjbhai
16

Sementara jawaban di sini tidak "salah", saya akan menambahkan yang lain: jangan pernah membuat perubahan variabel lingkungan di OS X yang memengaruhi "semua proses", atau bahkan, di luar shell, untuk semua proses yang dijalankan secara interaktif oleh pengguna tertentu.

Dalam pengalaman saya, perubahan global ke variabel lingkungan seperti PATH untuk semua proses bahkan lebih mungkin untuk memecahkan hal-hal pada OS X daripada di Windows. Alasannya, banyak aplikasi OS X dan perangkat lunak lain (termasuk, mungkin terutama, komponen OS itu sendiri) bergantung pada alat-alat baris perintah UNIX di bawah tenda, dan menganggap perilaku versi dari alat-alat ini disediakan dengan sistem, dan tidak perlu menggunakan jalur absolut saat melakukannya (komentar serupa berlaku untuk pustaka yang dimuat secara dinamis dan variabel lingkungan DYLD_ *). Pertimbangkan, misalnya, bahwa jawaban dengan nilai tertinggi untuk berbagai pertanyaan Stack Overflow tentang mengganti versi penerjemah yang disediakan OS X seperti Python dan Ruby umumnya mengatakan "jangan lakukan ini."

OS X benar-benar tidak berbeda dari sistem operasi mirip UNIX lainnya (misalnya, Linux, FreeBSD, dan Solaris) dalam hal ini; alasan yang paling mungkin mengapa Apple tidak menyediakan cara mudah untuk melakukan ini adalah karena hal itu merusak banyak hal . Sejauh Windows tidak rentan terhadap masalah ini, itu disebabkan oleh dua hal: (1) perangkat lunak Windows cenderung tidak bergantung pada alat baris perintah sejauh perangkat lunak UNIX, dan (2) Microsoft telah memiliki seperti sejarah "DLL hell" dan masalah keamanan yang disebabkan oleh perubahan yang memengaruhi semua proses sehingga mereka mengubah perilaku pemuatan dinamis dalam versi Windows yang lebih baru untuk membatasi dampak opsi konfigurasi "global" seperti PATH.

"Lame" atau tidak, Anda akan memiliki sistem yang jauh lebih stabil jika Anda membatasi perubahan tersebut pada cakupan yang lebih kecil.

Jason T. Miller
sumber
1
Memberitahu orang untuk tidak melakukan hal yang mereka tanyakan adalah bukan jawaban untuk pertanyaan yang mereka tanyakan. Mencegah orang melakukan hal ini juga melanggar banyak hal. Mode operasi Apple.
frabjous
Mengatur PATH di /Applications/App.app/Contents/Info.plist dengan LSEnvironment key developer.apple.com/library/archive/documentation/General/… mungkin solusi yang disarankan saat ini.
Dave X
15

Terkadang semua jawaban sebelumnya tidak berhasil. Jika Anda ingin memiliki akses ke variabel sistem (seperti M2_HOME) di Eclipse atau di IntelliJ IDEA, satu-satunya hal yang berfungsi untuk saya dalam hal ini adalah:

Sunting (langkah 1) pertama yang /etc/launchd.confberisi baris seperti ini: "setenv VAR value" dan kemudian (langkah 2) reboot.

Cukup memodifikasi .bash_profile tidak akan berfungsi karena di OS X aplikasi tidak dimulai seperti di Unix'es lainnya; mereka tidak mewarisi variabel shell induknya. Semua modifikasi lainnya tidak akan berfungsi karena alasan yang tidak saya ketahui. Mungkin orang lain bisa mengklarifikasi tentang ini.

Bruno Ranschaert
sumber
5
Aplikasi dimulai dari Spotlight atau dengan cara lain berarti semua memiliki /etc/launchd.conf dibaca oleh proses induknya, sehingga menjadikannya pilihan yang menarik untuk mengatur variabel lingkungan yang terlihat di semua aplikasi dan shell.
Matthew McCullough
1
Lihat jawaban saya untuk solusi lain, yang menghindari reboot - stackoverflow.com/questions/135688/…
Matt Curtis
Mesin MaxOS 10.6 saya tidak memiliki file /etc/launchd.conf. Apakah ini hal yang baru atau usang pada versi ini? Atau apakah mesin ini kacau?
peterk
13

Setelah mengejar panel preferensi Variabel Lingkungan dan menemukan bahwa tautan rusak dan pencarian di situs Apple tampaknya mengindikasikan mereka telah melupakannya ... Saya mulai kembali ke jejak proses launchd yang sulit dipahami.

Pada sistem saya (Mac OS X 10.6.8) tampak bahwa variabel didefinisikan dalam environment.plist yang sedang andal diekspor ke aplikasi diluncurkan dari Spotlight (melalui launchd). Masalah saya adalah bahwa vars tersebut tidak diekspor ke sesi bash baru di Terminal. Yaitu saya memiliki masalah sebaliknya seperti yang digambarkan di sini.

CATATAN: environment.plist terlihat seperti JSON, bukan XML, seperti yang dijelaskan sebelumnya

Saya bisa mendapatkan aplikasi Spotlight untuk melihat vars dengan mengedit ~ / MacOSX / environment.plist dan saya bisa memaksa vars yang sama ke sesi Terminal baru dengan menambahkan yang berikut ke file .profile saya:

eval $(launchctl export)
Russell B
sumber
2
Tidak sulit dipahami: RCenvironment
Gilimanjaro
Tip yang bagus tentang launchctl ekspor. Tapi saya tidak akan memasukkan apa adanya ke dalam profil. Ini akan menimpa $ PATH Anda dengan yang tidak termasuk / usr / local / bin. Tetapi Anda dapat menggunakan regex untuk memilih vars yang Anda minati: `` eval $ (launchctl export | grep '^ my. * =').
mivk
3
Pada mesin Mountain Lion baru saya (10.8.2) environment.plist sama sekali tidak berharga. Lihat jawaban Matius untuk jalur yang benar. Ini semua tentang diluncurkan dan aplikasi command-line launchctl bersama dengan /etc/launchd.conf. Anda dapat membaca diri dengan man launchd, man launchctl, dan man launchd.confdi jendela terminal. Senang Apple memperbarui halaman manual, bahkan jika Perpustakaan Pengembang Mac sedikit terlambat.
Russell B
10

Setiap file yang Bash startup - ~/.bashrc, ~/.bash_profile, ~/.profile. Ada juga semacam file aneh bernama ~/.MacOSX/environment.plistuntuk variabel lingkungan di aplikasi GUI.

John Millikin
sumber
10

Sama seperti jawaban yang diberikan Matt Curtis, saya menetapkan variabel lingkungan melalui launchctl, tetapi saya membungkusnya dalam fungsi yang disebut ekspor, sehingga setiap kali saya mengekspor variabel seperti biasa di .bash_profile, itu juga diatur oleh launchctl. Inilah yang saya lakukan:

  1. .Bash_profile saya hanya terdiri dari satu baris, (Ini hanya preferensi pribadi.)

    source .bashrc
  2. .Bashrc saya memiliki ini:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. Hal di atas akan membebani Bash bawaan dalam "ekspor" dan akan mengekspor semuanya secara normal (Anda akan melihat saya mengekspor "ekspor" dengan itu!), Lalu mengaturnya dengan benar untuk lingkungan aplikasi OS X melalui launchctl, apakah Anda menggunakan salah satu dari yang berikut:

    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. Dengan cara ini saya tidak perlu mengirim setiap variabel ke launchctl setiap waktu, dan saya bisa mengatur .bash_profile / .bashrc saya mengatur seperti yang saya inginkan. Buka jendela terminal, periksa variabel lingkungan yang Anda minati launchctl getenv myVar, ubah sesuatu di .bash_profile / .bashrc Anda, tutup jendela terminal dan buka kembali, periksa lagi variabel dengan launchctl, dan voilá, itu diubah.

  5. Sekali lagi, seperti solusi lain untuk dunia Lion Mountain, untuk variabel lingkungan baru yang tersedia untuk aplikasi, Anda perlu meluncurkan atau meluncurkannya kembali setelah perubahan.

courtlandj
sumber
1
Jawaban yang berguna - terima kasih. Saya baru saja memutakhirkannya karena solusi awal Anda tidak menangani kasus di mana nilai variabel lingkungan yang Anda setel sama dengan tanda-tanda di dalamnya (mis., CXX_FLAGS = "- mmacosx-version-min = 10.9"
Steve Broberg
@SteveBroberg - hanya satu perubahan karakter memperbaiki Bash regexp tanpa perlu sed! (Jangan salah paham, saya suka sed, tapi ini berhasil dan jauh lebih pendek.)
courtlandj
1
Saya pikir pasti ada cara yang lebih baik, tapi saya bukan guru bash, dan saya tidak bisa melihat apa %%, ##, dll.
Steve Broberg
10

Berikut adalah cara yang sangat sederhana untuk melakukan apa yang Anda inginkan. Dalam kasus saya, membuat Gradle berfungsi (untuk Android Studio).

  • Buka Terminal.
  • Jalankan perintah berikut:

    sudo nano /etc/paths atau sudo vim /etc/paths

  • Masukkan kata sandi Anda, saat diminta.

  • Buka bagian bawah file, dan masukkan jalur yang ingin Anda tambahkan.
  • Tekan Control+ Xuntuk berhenti.
  • Masukkan 'Y' untuk menyimpan buffer yang dimodifikasi.
  • Buka jendela terminal baru kemudian ketik:

    echo $PATH

Anda akan melihat jalur baru ditambahkan ke akhir PATH.

Saya mendapat detail ini dari pos ini:

Tambahkan ke PATH pada Mac OS X 10.8 Mountain Lion dan yang lebih tinggi

wired00
sumber
7

Agar singkat dan jelas tentang apa yang dimaksudkan untuk setiap file

  • ~/.profile bersumber setiap kali Terminal.app diluncurkan
  • ~/.bashrc Di sinilah "secara tradisional" semua pernyataan ekspor untuk lingkungan Bash ditetapkan
  • /etc/paths adalah file utama di Mac OS yang berisi daftar jalur default untuk membangun variabel lingkungan PATH untuk semua pengguna
  • /etc/paths.d/ berisi file yang berisi jalur pencarian tambahan

Program-program non-terminal tidak mewarisi variabel PATH dan MANPATH di seluruh sistem seperti yang dilakukan terminal Anda! Untuk mengatur lingkungan untuk semua proses yang diluncurkan oleh pengguna tertentu, sehingga membuat variabel lingkungan tersedia untuk aplikasi Mac OS X GUI, variabel-variabel tersebut harus ditentukan di~/.MacOSX/environment.plist (Tanya Jawab Teknis Apple QA1067)

Gunakan baris perintah berikut untuk menyinkronkan Anda environment.plistdengan /etc/paths:

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

/etc/launchd.conf tidak digunakan di OS X v10.10 (Yosemite), OS X v10.11 (El Capitan), macOS v10.12 (Sierra), atau macOS v10.13 (Sierra Tinggi).


Dari launchctlhalaman manual:

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

Metode yang dijelaskan dalam jawaban Ask Different ini berfungsi untuk saya (setelah reboot): aplikasi yang diluncurkan dari Dock atau dari Spotlight mewarisi variabel lingkungan yang saya atur ~/Library/LaunchAgents/my.startup.plist. (Dalam kasus saya, saya perlu mengatur LANG, untuk en_US.UTF-8, untuk plugin Teks Sublime.)

David
sumber
Saat reboot, apakah ada perintah pemuatan yang memastikan my.startup.plist akan dimuat sebelum aplikasi dari sesi terakhir di-restart?
kunjbhai
3

Itu mudah:

Edit ~ / .profile dan letakkan variabel Anda sebagai berikut

$ vim ~ / .profile

Dalam file put:

MY_ENV_VAR = nilai

  1. Simpan (: wq)

  2. Mulai ulang terminal (Berhenti dan buka lagi)

  3. Pastikan semuanya baik-baik saja:

$ echo $ MY_ENV_VAR

$ value


Fernando Martínez
sumber
3

Untuk satu modifikasi pengguna, gunakan ~/.profileyang Anda daftarkan. Tautan berikut menjelaskan kapan berbagai file dibaca oleh Bash.

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

Jika Anda ingin mengatur variabel lingkungan untuk aplikasi gui, Anda memerlukan file ~ / .MacOSX / environment.plist

mmaibaum
sumber
3

Yah, saya tidak yakin tentang /etc/pathsdan ~/.MacOSX/environment.plistfile. Itu baru.

Tetapi dengan Bash, Anda harus tahu bahwa .bashrcdieksekusi dengan setiap permintaan shell baru dan .bash_profilehanya dieksekusi sekali pada saat startup.

Saya tidak tahu seberapa sering ini dengan Mac OS X. Saya pikir perbedaannya telah rusak dengan sistem jendela meluncurkan segalanya.

Secara pribadi, saya menghilangkan kebingungan dengan membuat .bashrcfile dengan semua yang saya butuhkan dan kemudian melakukan:

ln -s .bashrc .bash_profile
mike511
sumber
3

Satu hal yang perlu diperhatikan selain pendekatan yang disarankan adalah bahwa, dalam OS X 10.5 (Leopard) setidaknya, variabel yang diatur launchd.confakan digabungkan dengan pengaturan yang dibuat .profile. Saya kira ini mungkin juga berlaku untuk pengaturan ~/.MacOSX/environment.plist, tetapi saya belum memverifikasi.

MiB
sumber
3

Atur variabel lingkungan PATH Anda di Mac OS

Buka program Terminal (ini ada di folder Aplikasi / Utilitas Anda secara default). Jalankan perintah berikut

touch ~/.bash_profile; open ~/.bash_profile

Ini akan membuka file di editor teks default Anda.

Untuk Android SDK sebagai contoh:

Anda perlu menambahkan path ke direktori platform-alat dan alat SDK Android Anda. Dalam contoh saya, saya akan menggunakan "/ Development / android-sdk-macosx" sebagai direktori tempat SDK diinstal. Tambahkan baris berikut:

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

Simpan file dan keluar dari editor teks. Jalankan .bash_profile Anda untuk memperbarui PATH Anda:

source ~/.bash_profile

Sekarang setiap kali Anda membuka program Terminal, PATH Anda akan menyertakan Android SDK.

Charaf JRA
sumber
3

Lakukan saja ini sangat mudah dan cepat. Pertama buat ~ / .bash_profile dari terminal:

touch .bash_profile

kemudian

open -a TextEdit.app .bash_profile

Menambahkan

export TOMCAT_HOME=/Library/Tomcat/Home

simpan dokumen dan Anda selesai.

CodeOverRide
sumber
Perfecto. Saya mengikuti langkah-langkah untuk JAVA_HOME, Baru saja menambahkan ekspor JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contents / Home dan kesuksesan cepat nyata!
NarendraC
@NarendraC Hebat!
CodeOverRide
2

Sederhana saja. Edit file .profile(vi, nano , Teks Sublime atau editor teks lainnya). Anda dapat menemukannya di ~/direktori (direktori pengguna) dan atur seperti ini:

export MY_VAR=[your value here]

Contoh dengan Java home:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Simpan dan kembali ke terminal.

Anda dapat memuatnya kembali dengan:

source .profile

Atau tutup dan buka jendela terminal Anda.

francois.robert
sumber
2

Ada dua jenis kerang yang dimainkan di sini.

  • Non-login: .bashrc dimuat ulang setiap kali Anda memulai salinan Bash baru
  • Login: Profil. Hanya dimuat ketika Anda masuk, atau secara eksplisit memberitahu Bash untuk memuatnya dan menggunakannya sebagai shell login.

Sangat penting untuk memahami di sini bahwa dengan Bash, berkas .bashrchanya dibaca oleh shell yang baik interaktif dan non-login, dan Anda akan menemukan bahwa orang sering memuat .bashrcdalam .bash_profilemengatasi keterbatasan ini.

Sekarang setelah Anda memiliki pemahaman dasar, mari beralih ke bagaimana saya akan menyarankan Anda untuk mengaturnya.

  • .profile: membuatnya tidak ada. Masukkan pengaturan PATH Anda di sana.
  • .bashrc: buat jika tidak ada. Masukkan semua alias dan metode khusus Anda di sana.
  • .bash_profile: buat jika tidak ada. Letakkan yang berikut di sana.

.bash_file:

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

Login Shells

/etc/profile

Shell pertama kali mengeksekusi perintah dalam file /etc/profile. Seorang pengguna yang bekerja dengan hak akses root dapat mengatur file ini untuk menetapkan karakteristik default seluruh sistem untuk pengguna yang menjalankan Bash.

.bash_profile
.bash_login
.profile

Berikutnya terlihat shell untuk ~/.bash_profile, ~/.bash_logindan ~/.profile(~ / tangan pendek untuk direktori rumah Anda), agar, mengeksekusi perintah dalam pertama file-file ini ditemukan. Anda dapat menempatkan perintah di salah satu file ini untuk mengganti default yang ditetapkan /etc/profile. Shell yang berjalan pada terminal virtual tidak menjalankan perintah dalam file ini.

.bash_logout

Saat Anda keluar, bash mengeksekusi perintah di ~/.bash_logout file. File ini sering memegang perintah yang membersihkan setelah sesi, seperti yang menghapus file sementara.

Kerang Nonlogin Interaktif

/etc/bashrc

Meskipun tidak dipanggil oleh bash secara langsung, banyak ~/.bashrcfile memanggil /etc/bashrc. Setup ini memungkinkan pengguna yang bekerja dengan hak root untuk membangun karakteristik default seluruh sistem untuk shell bash nonlogin.

.bashrc

Shell nonlogin interaktif menjalankan perintah dalam ~/.bashrcfile. Biasanya file startup untuk shell login, seperti .bash_profile, menjalankan file ini, jadi baik shell login maupun nonlogin menjalankan perintah .bashrc.

Karena perintah di .bashrcdapat dieksekusi berkali-kali, dan karena subkulit mewarisi variabel yang diekspor, sebaiknya masukkan perintah yang menambah variabel yang ada dalam .bash_profilefile.

Koray Tugay
sumber
2

Semua keajaiban di iOS hanya sesuai dengan penggunaan sourcedengan file, tempat Anda mengekspor variabel lingkungan Anda.

Sebagai contoh:

Anda dapat membuat file seperti ini:

export bim=fooo
export bom=bar

Simpan file ini sebagai bimbom.env, dan lakukan source ./bimbom.ev. Voa, Anda punya variabel lingkungan Anda.

Periksa dengan:

echo $bim
suther
sumber
1

Untuk Bash, coba tambahkan variabel lingkungan Anda ke file /etc/profileuntuk membuatnya tersedia untuk semua pengguna. Tidak perlu reboot, cukup memulai sesi Terminal baru.

Rabi
sumber