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_profile
suka 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 plist
akhiran (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>
-l
parameter sangat penting di sini; itu diperlukan untuk mengeksekusi skrip shell dengan shell login sehingga ~/.bash_profile
bersumber di tempat pertama sebelum skrip ini dijalankan.
Sekarang, skrip shell. Buat ~/.osx-env-sync.sh
dengan 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).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
untuk meluncurkan aplikasi GUI dengan lingkungan sistem set yang baru.