Tôi đã cố gắng đi đến thỏa thuận về cách đặt các biến môi trường cần thiết bằng cách khởi chạy các ứng dụng ở Sierra, nhưng tôi bối rối.
Theo các lời khuyên khác nhau được tìm thấy trực tuyến, tôi đã tạo một tệp ~/Library/LaunchAgents/environment.plist
. Nó trông như thế này:
<?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>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>
launchctl setenv FOO foo
launchctl setenv BAR bar
<!-- ... -->
launchctl setenv PATH /usr/local/opt/scala210/bin:/usr/local/bin:$PATH
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Từ thử nghiệm của tôi, có vẻ như không có gì khác hơn là khởi động lại hệ thống sẽ làm cho các thay đổi đối với tệp này có hiệu lực. Tôi đã tìm thấy đề cập đến lệnh này được cho là sẽ thực hiện thủ thuật:
$ launchctl load ~/Library/LaunchAgents/environment.plist
... nhưng khi tôi chạy nó, tôi nhận được phản hồi này:
[my home dir]/Library/LaunchAgents/environment.plist: service already loaded
Trong tài liệu cho launchctl
Tôi thấy đề cập đến một -F
cờ có vẻ phù hợp:
Force the loading or unloading of the plist. Ignore the Disabled key.
Tuy nhiên, sẽ không có gì khác biệt nếu tôi bao gồm công tắc này; Tôi nhận được cùng một đầu ra và các tập tin được bỏ qua.
Vì vậy, dù sao đi nữa, việc khởi động lại sẽ làm cho các thay đổi có hiệu lực (có thể đăng xuất và quay lại cũng vậy? Tôi không kiểm tra), nhưng với một ngoại lệ PATH
biến. Biến đó chỉ giữ nguyên cho dù tôi đã thay đổi nó như thế nào, và trên các lần khởi động lại. Cuối cùng, tôi tình cờ thấy một câu trả lời Stack Exchange đã cảnh báo một cách khéo léo rằng việc thay đổi PATH
theo cách này sẽ bị bỏ qua cho đến khi Dock được khởi động lại với killall Dock
chỉ huy. Vì vậy, tôi đã làm điều đó, và khởi động lại, và cuối cùng Tôi đã có PATH
đặt chính xác.
Vì vậy, dù sao, tôi cho rằng câu hỏi chính của tôi sẽ là: Có cách nào rắc rối hơn để cập nhật các biến môi trường hơn cách tôi phác thảo ở trên không? Và một câu hỏi phụ có thể là: Việc xử lý đặc biệt PATH
có ý nghĩa gì không?
echo $FOO
; cái cưafoo
; và thoát khỏi Terminal. Sau đó tôi dỡ hàngenvironment.plist
với bạnlaunchctl unload ...
lệnh trên, đã thay đổi lệnh trong tập tin đó thànhlaunchctl setenv FOO bar
, đã lưu tệp và tải tệp bằnglaunchctl load ...
chỉ huy. Cuối cùng tôi ra mắt Terminal lần nữa, gõecho $FOO
và vẫn thấy đầu rafoo
. ... Ah, nếu tôi giết và khởi động lại dock vớikillall Dock
, sau đó khởi chạy lại Terminal, cuối cùng tôi cũng thấy giá trị cập nhật củaFOO
. Địa ngục đẫm máu, thật là đau.