Sau khi tôi đã sắp xếp các vấn đề về OSX 'PATH cho đến phiên bản Mavericks, các vấn đề sẽ quay trở lại ở Yosemite !!!
Vì vậy, tôi muốn bắt chước launch.conf
tính năng cũ trong bản phát hành Yosemite Mac OSX 10.10 mới, để có sẵn biến môi trường PATH trong các ứng dụng GUI như Carbon Emacs hoặc RStudio . Tôi đã sử dụng ý tưởng tuyệt vời của ursa stackoverflow để thiết lập một tập lệnh shell để cấu hình các biến môi trường thông qua launchctl
. (Xem câu trả lời stackoverflow của anh ấy ở đây .) Điều này hoạt động với hầu hết các biến môi trường, nhưng không phải cho biến PATH .
1. Tôi đã làm gì?
Đầu tiên tôi viết /etc/environment.rc
kịch bản trông như sau:
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"
Sau đó, tôi đã tạo ra các bảng cho launchd
(danh sách này và các tập lệnh được đề cập khác trong phần phụ lục bên dưới). Sau đó, tôi kích hoạt chúng với
$ sudo launchctrl load ...
Sau đó, tôi đã vô hiệu hóa path_helper
tiện ích trong /etc/
hồ sơ tập tin shell init để nó không ghi đè environment.rc
cài đặt. Và cuối cùng tôi khởi động lại máy.
2. Hiệu quả là gì?
Khi tôi khởi động Terminal, các biến môi trường mới JAVA_HOME
và ENVIRONMENT_RC
được đặt theo environment.rc
, nhưng PATH được đặt thành
/ usr / bin: / bin
Để đảm bảo, không có bash
tệp init nào cản trở tôi viết một đoạn script python nhỏ (trong phần phụ lục) để hiển thị các biến trong môi trường hiện tại và tôi thực hiện điều này trực tiếp bằng cách nhấp đúp vào trình bao bọc Platypus . Một lần nữa các biến mới được đặt, trong khi PATH có mặc định hệ thống.
Vậy tại sao tôi có thể đặt các biến khác, nhưng không phải là biến PATH? Và làm thế nào tôi có thể giải quyết điều này một cách thống nhất ?
Cập nhật:
Tình huống rất khó hiểu: Shell ( bash
ít nhất) trong Terminal hoặc Emacs sẽ chọn PATH mà bạn đã đặt qua launchctl
, nhưng các ứng dụng GUI khác sẽ không làm như vậy. Ví dụ: tập lệnh python tối thiểu được đề cập trực tiếp được gọi qua Platypus sẽ không hiển thị tùy chỉnh của bạn con đường. Và ngay cả bản thân Emacs cũng không biết đúng PATH: Bạn nhận thấy điều này, ví dụ như khi bạn ban hành lệnh Emacs M-x ispell-buffer
; công cụ unix ispell
mà emacs cố gắng gọi sẽ không được tìm thấy nếu nó chỉ nằm trên đường dẫn tùy chỉnh của bạn.
ruột thừa
net.halloleo.environment.plist
, tập tin cấu hình launchd trong /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
, tập tin cấu hình launchd trong /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
, tệp khởi động bash đã sửa đổi:
# 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
, tập lệnh hiển thị tất cả các biến môi trường:
import os
print (os.environ)
/usr/libexec/path_helper
trong quá trình khởi tạo của chúng. Các ứng dụng GUI không nhận được PATH theo/etc/paths
- và tôi đã hỏi cụ thể về các ứng dụng GUI.