Mengatur variabel lingkungan di OS X untuk aplikasi GUI

18

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

Ulysses Percival
sumber
@ ersin-er Jawaban dari StackOverflow "Solusi untuk baris perintah dan aplikasi GUI dari satu sumber (bekerja dengan Yosemite & El Capitan)" mungkin menarik bagi orang yang menemukan pertanyaan ini.
l --marc l

Jawaban:

16

Di Mountain Lion semua /etc/pathsdan /etc/launchd.confpengeditan 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")

Tampilkan Isi Paket

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 )

masukkan deskripsi gambar di sini

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.

Flori
sumber
1
Terima kasih! Ini sempurna bagi saya. Pada 10.11 (El Capitan) saya juga harus menjalankan perintah yang disediakan oleh Matthew untuk melihat perubahan saya Info.plistberlaku.
dsedivec
8

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_helperuntuk 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 launchctlperintah, 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:

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

  2. Seperti yang disebutkan di sini (Jerman dan di balik paywall!), Dimungkinkan untuk menempatkan skrip di agen peluncuran itu sendiri.

  3. Saya tidak yakin seberapa aman solusi ini, karena menggunakan evalstring yang disediakan pengguna.

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

Ulysses Percival
sumber
Ngomong-ngomong, jika seseorang ingin mendefinisikan PATH-Variable di lingkungan Terminal dan menggunakan agen peluncuran ini, saya sarankan untuk menulis export PATH=.:"$(launchctl getenv PATH)"di ~ / .bash_profile (sama untuk shell lainnya). Ini dimungkinkan karena path_helperdisebut dalam skrip shell. Untuk detail lebih lanjut tentang variabel PATH di OS X, periksa jawaban ini .
Percival Ulysses
3

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
Matius
sumber
Saya memiliki perilaku yang sama dengan El Capitan, dan saya telah menambahkan poin Anda ke jawaban @ flori
Seki
2

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 0dan 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 Finderdapat ditambahkan juga.

Dalam .bash_profilesaya menggunakan garis

export PATH=`launchctl getenv PATH`

untuk mengatur PATH untuk Terminal, dengan cara ini PATH dikendalikan dari lokasi yang sama, file ~ / .conf.launchd .

Ury Marshak
sumber
0

Pilihan lain adalah menggunakan /etc/launchd.conf. Misalnya saya telah mengubah default PATHdengan 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.confdengan memulai ulang, atau dengan menjalankan launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confdan menghentikan serta meluncurkan kembali proses.

Pengaturan dalam /etc/launchd.confberlaku untuk proses launchd root dan proses launchd per pengguna. Variabel lingkungan yang diset dengan setenvdalam /etc/launchd.confditunjukkan oleh keduanya sudo launchctl exportdan launchctl export.

Lri
sumber