Setelah saya menyelesaikan masalah PATH OSX hingga rilis Mavericks, masalahnya kembali di Yosemite !!!
Jadi saya ingin meniru launch.conf
fitur lama di rilis Yosemite Mac OSX 10.10 baru, untuk memiliki variabel lingkungan PATH dalam aplikasi GUI seperti Carbon Emacs atau RStudio tersedia. Saya menggunakan ide hebat dari stackoverflow ursa pengguna untuk mengatur skrip shell yang mengkonfigurasi variabel lingkungan melalui launchctl
. (Lihat jawaban stackoverflow-nya di sini .) Ini berfungsi untuk sebagian besar variabel lingkungan, tetapi tidak untuk variabel PATH .
1. Apa yang telah saya lakukan?
Pertama saya menulis /etc/environment.rc
skrip yang terlihat seperti:
launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"
Kemudian saya membuat daftar untuk launchd
(daftar ini dan skrip lain yang disebutkan dalam lampiran di bawah). Lalu saya mengaktifkannya dengan
$ sudo launchctrl load ...
Kemudian saya menonaktifkan path_helper
utilitas di /etc/
profil file init shell , sehingga tidak menimpa environment.rc
pengaturan. Dan akhirnya saya me-restart mesin.
2. Apa efeknya?
Ketika saya memulai Terminal, variabel lingkungan baru JAVA_HOME
dan ENVIRONMENT_RC
diatur sesuai dengan environment.rc
, tetapi PATH diatur ke
/ usr / bin: / bin
Untuk memastikan, tidak ada bash
file init yang menghalangi saya menulis skrip python kecil sebagai gantinya (dalam lampiran juga) untuk menunjukkan variabel-variabel di lingkungan saat ini dan saya menjalankan ini secara langsung dengan mengklik ganda bungkus Platypus . Sekali lagi variabel baru ditetapkan, sementara PATH memiliki sistem default.
Jadi mengapa saya bisa mengatur variabel lain, tetapi tidak variabel PATH? Dan bagaimana saya bisa menyelesaikan ini secara terpadu ?
Memperbarui:
Situasinya sangat membingungkan: Shell ( bash
setidaknya) di Terminal atau Emacs akan mengambil PATH yang Anda atur launchctl
, tetapi aplikasi GUI lain tidak akan melakukannya., Mis. Skrip python minimal yang disebut langsung yang dipanggil melalui Platypus tidak akan menampilkan kustom Anda jalan. Dan bahkan Emacs sendiri tidak tahu PATH yang benar: Anda melihat ini misalnya ketika Anda mengeluarkan perintah Emacs M-x ispell-buffer
; alat unix ispell
yang coba dipanggil emacs tidak akan ditemukan jika hanya di jalur kustom Anda.
Lampiran
net.halloleo.environment.plist
, file konfigurasi launchd di /Library/LaunchDaemons/
:
<?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>KeepAlive</key>
<false/>
<key>Label</key>
<string>net.halloleo.environment</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/etc/environment.rc</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment.rc</string>
</array>
</dict>
</plist>
net.halloleo.environment-user.plist
, file konfigurasi launchd 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>KeepAlive</key>
<false/>
<key>Label</key>
<string>net.halloleo.environment-user</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/etc/environment.rc</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment.rc</string>
</array>
</dict>
</plist>
/etc/profile
, file permulaan pesta modifikasi:
# System-wide .profile for sh(1)
# if [ -x /usr/libexec/path_helper ]; then
# eval `/usr/libexec/path_helper -s`
# fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
show_environ.py
, skrip yang menampilkan semua variabel lingkungan:
import os
print (os.environ)
/usr/libexec/path_helper
selama proses inisialisasi mereka. Aplikasi GUI tidak mendapatkan PATH menurut/etc/paths
- dan saya bertanya secara khusus tentang aplikasi GUI.