Giải pháp cho cả dòng lệnh và ứng dụng GUI từ một nguồn duy nhất (hoạt động với Mac OS X v10.10 (Yosemite) và Mac OS X v10.11 (El Capitan))
Giả sử bạn có định nghĩa biến môi trường theo ý ~/.bash_profile
muốn trong đoạn mã sau:
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"
Chúng tôi cần một Đại lý khởi chạy sẽ chạy trên mỗi lần đăng nhập và bất cứ lúc nào theo yêu cầu sẽ tải các biến này vào phiên người dùng. Chúng ta cũng cần một kịch bản shell để phân tích các định nghĩa này và xây dựng các lệnh cần thiết được thực thi bởi tác nhân.
Tạo một tệp có plist
hậu tố (ví dụ như tên osx-env-sync.plist
) trong ~/Library/LaunchAgents/
thư mục với các nội dung sau:
<?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
tham số là rất quan trọng ở đây; nó là cần thiết để thực thi tập lệnh shell với shell đăng nhập để ~/.bash_profile
có nguồn gốc ở vị trí đầu tiên trước khi tập lệnh này được thực thi.
Bây giờ, kịch bản shell. Tạo nó tại ~/.osx-env-sync.sh
với các nội dung sau:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Hãy chắc chắn rằng tập lệnh shell có thể thực thi được:
chmod +x ~/.osx-env-sync.sh
Bây giờ, tải tác nhân khởi chạy cho phiên hiện tại:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Re) Khởi chạy một ứng dụng GUI và xác minh rằng nó có thể đọc các biến môi trường.
Các thiết lập là liên tục. Nó sẽ tồn tại khởi động lại và relogins.
Sau khi thiết lập ban đầu (mà bạn vừa thực hiện), nếu bạn muốn phản ánh bất kỳ thay đổi nào trong ~/.bash_profile
toàn bộ môi trường của mình, hãy chạy lại launchctl load ...
lệnh sẽ không thực hiện những gì bạn muốn; thay vào đó bạn sẽ nhận được một cảnh báo như sau:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Để tải lại các biến môi trường của bạn mà không cần thông qua quá trình đăng xuất / đăng nhập, hãy làm như sau:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Cuối cùng, hãy đảm bảo rằng bạn khởi chạy lại các ứng dụng đã chạy (bao gồm Terminal.app) để làm cho chúng biết về các thay đổi.
Tôi cũng đã đẩy mã và giải thích ở đây cho một dự án GitHub: osx-env-sync .
Tôi hy vọng đây sẽ là giải pháp tối ưu, ít nhất là cho các phiên bản mới nhất của OS X (Yosemite & El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
để khởi chạy ứng dụng GUI với môi trường hệ thống thiết lập mới.