Bagaimana cara mengatur variabel lingkungan di Mac OS X sehingga tersedia untuk aplikasi GUI tanpa menggunakan ~ / .MacOSX / environment.plist atau Login Hooks (karena ini sudah tidak digunakan lagi )?
Bagaimana cara mengatur variabel lingkungan di Mac OS X sehingga tersedia untuk aplikasi GUI tanpa menggunakan ~ / .MacOSX / environment.plist atau Login Hooks (karena ini sudah tidak digunakan lagi )?
Jawaban:
Di Mountain Lion semua /etc/paths
dan /etc/launchd.conf
pengeditan tidak berpengaruh!
Forum Pengembang Apple mengatakan:
"Ubah Info.plist dari .app itu sendiri untuk memuat 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
")
dan 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 )
sekarang App (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.
Info.plist
berlaku.
Solusi ini menggunakan fungsionalitas launchctl
, dikombinasikan dengan Agen Peluncuran untuk meniru kait login lama. Untuk solusi lain menggunakan store of launchd
, lihat perbandingan ini . Agen peluncuran yang digunakan di sini terletak di / 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>user.conf.launchd</string>
<key>Program</key>
<string>/Users/Shared/conflaunchd.sh</string>
<key>ProgramArguments</key>
<array>
<string>~/.conf.launchd</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>StandardIO</string>
</array>
</dict>
</plist>
Satu hal penting adalah kunci RunAtLoad sehingga agen peluncuran dijalankan secepat mungkin. Karya nyata yang dilakukan dalam shell naskah /Users/Shared/conflaunchd.sh , yang berbunyi ~ / .conf.launchd dan feed ke launchctl
:
#! /bin/bash
#filename="$1"
filename="$HOME/.conf.launchd"
if [ ! -r "$filename" ]; then
exit
fi
eval $(/usr/libexec/path_helper -s)
while read line; do
# skip lines that only contain whitespace or a comment
if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi
eval launchctl $line
done <"$filename"
exit 0
Perhatikan panggilan path_helper
untuk mengatur PATH dengan benar. Akhirnya, ~ / .conf.launchd terlihat seperti itu
setenv PATH ~/Applications:"${PATH}"
setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:
# Locale
setenv LANG en_US.UTF-8
Ini adalah launchctl
perintah, lihat manualnya untuk informasi lebih lanjut. Bekerja dengan baik untuk saya (saya harus menyebutkan bahwa saya masih seorang pria Macan Tutul Salju), aplikasi GUI seperti texstudio dan TeXShop dapat melihat pohon tex saya sendiri. Hal-hal yang dapat diperbaiki:
Script shell memiliki #filename="$1"
di dalamnya. Ini bukan kebetulan, karena nama file harus diumpankan ke skrip oleh agen peluncuran sebagai argumen, tetapi itu tidak berhasil.
Seperti yang disebutkan di sini (Jerman dan di balik paywall!), Dimungkinkan untuk menempatkan skrip di agen peluncuran itu sendiri.
Saya tidak yakin seberapa aman solusi ini, karena menggunakan eval
string yang disediakan pengguna.
Saya pikir perlu diingat bahwa definisi MANPATH menggunakan metode ini tidak berfungsi dengan baik, tapi saya tidak yakin.
Harus disebutkan bahwa Apple menginginkan pendekatan yang agak mirip dengan memasukkan hal-hal di ∼ / launchd.conf , tetapi saat ini tidak didukung untuk tanggal dan OS ini (lihat halaman manual launchd.conf
). Saya kira hal-hal seperti globbing tidak akan berfungsi seperti yang mereka lakukan dalam proposal ini. Dan tentu saja orang dapat meletakkan file-file ini di tempat lain, kecuali agen peluncuran yang harus berada di / Library / LaunchAgents / atau ~ / Library / LaunchAgents / .
Akhirnya, saya harus menyebutkan sumber yang saya gunakan sebagai informasi tentang Agen Peluncuran: 1 , 2 , 3 , 4 .
Pembaruan : Ini tidak berfungsi dalam versi 10.8 saat ini. Penanganan masalah berdasarkan aplikasi dijelaskan di sini dan di sini .
export PATH=.:"$(launchctl getenv PATH)"
di ~ / .bash_profile (sama untuk shell lainnya). Ini dimungkinkan karena path_helper
disebut dalam skrip shell. Untuk detail lebih lanjut tentang variabel PATH di OS X, periksa jawaban ini .
Jawaban yang diberikan oleh @flori bekerja untuk saya di Maverick asalkan saya menjalankan perintah berikut di Terminal setelah mengubah file plist
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
Jawaban yang diberikan oleh @ percival-ulysses bekerja untuk saya pada 10.9 Mavericks dengan perubahan kecil berikut: sunting / Pengguna / Berbagi / skrip / conflaunchd.sh tepat sebelum exit 0
dan tambahkan baris
killall Dock
killall SystemUIServer
untuk me-restart Dock dan menubar. Setelah ini, aplikasi dimulai dari Dock atau dari Spotlight akan mewarisi PATH yang benar. Jika Anda menggunakan Finder untuk memulai aplikasi kritis PATH, maka killall Finder
dapat ditambahkan juga.
Dalam .bash_profile
saya menggunakan garis
export PATH=`launchctl getenv PATH`
untuk mengatur PATH untuk Terminal, dengan cara ini PATH dikendalikan dari lokasi yang sama, file ~ / .conf.launchd .
Pilihan lain adalah menggunakan /etc/launchd.conf
. Misalnya saya telah mengubah default PATH
dengan menambahkan baris ini ke /etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
Anda dapat menerapkan perubahan /etc/launchd.conf
dengan memulai ulang, atau dengan menjalankan launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
dan menghentikan serta meluncurkan kembali proses.
Pengaturan dalam /etc/launchd.conf
berlaku untuk proses launchd root dan proses launchd per pengguna. Variabel lingkungan yang diset dengan setenv
dalam /etc/launchd.conf
ditunjukkan oleh keduanya sudo launchctl export
dan launchctl export
.