Đặt các biến trong môi trường.plist


3

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?

Câu trả lời:


2
  • Dỡ bỏ tác nhân khởi động:

    launchctl unload ~/Library/LaunchAgents/environment.plist
    
  • Sửa đổi cài đặt plist / env
  • Tải lại tác nhân khởi chạy:

    launchctl load ~/Library/LaunchAgents/environment.plist
    

Bạn phải thoát và khởi chạy lại Terminal để lấy giá trị mới của biến trong vỏ Terminal.

Tôi khuyên bạn nên sử dụng một cái gì đó như

<string>launchctl setenv FOO foo; launchctl setenv BAR bar; launchctl setenv SUP sup</string>

Điều này không hoạt động. Tôi đã ra mắt Terminal; đánh máy echo $FOO; cái cưa foo; và thoát khỏi Terminal. Sau đó tôi dỡ hàng environment.plist với bạn launchctl unload ... lệnh trên, đã thay đổi lệnh trong tập tin đó thành launchctl setenv FOO bar, đã lưu tệp và tải tệp bằng launchctl load ... chỉ huy. Cuối cùng tôi ra mắt Terminal lần nữa, gõ echo $FOOvà vẫn thấy đầu ra foo. ... Ah, nếu tôi giết và khởi động lại dock với killall 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ủa FOO. Địa ngục đẫm máu, thật là đau.
Sean

@Sean Bây giờ đã thử nghiệm ở Sierra và nó cũng hoạt động. Không cần phải khởi động lại hoặc tắt ứng dụng (ngoại trừ Terminal phải khởi chạy lại). Tôi sẽ cố gắng thêm giải pháp hoặc giải pháp tốt hơn ...
klanomath
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.