Câu trả lời:
Tạo một environment.plist
tệp ~/Library/LaunchAgents/
với nội dung 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 PRODUCTS_PATH /Users/mortimer/Projects/my_products
launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
launchctl setenv PATH $PATH:/Applications/gradle/bin
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Bạn có thể thêm nhiều launchctl
lệnh bên trong <string></string>
khối.
Các plist
sẽ kích hoạt sau khi hệ thống khởi động lại. Bạn cũng có thể sử dụng launchctl load ~/Library/LaunchAgents/environment.plist
để khởi chạy nó ngay lập tức.
[Biên tập]
Giải pháp tương tự cũng hoạt động ở El Capitan.
Xcode 7.0+ không đánh giá các biến môi trường theo mặc định. Hành vi cũ có thể được kích hoạt bằng lệnh này:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Biên tập]
Có một vài tình huống trong đó điều này không thực sự hiệu quả. Nếu máy tính được khởi động lại và "Mở lại cửa sổ khi đăng nhập lại", cửa sổ mở lại có thể không thấy các biến (Có lẽ chúng được mở trước khi tác nhân được chạy). Ngoài ra, nếu bạn đăng nhập qua ssh, các biến sẽ không được đặt (vì vậy bạn sẽ cần đặt chúng trong ~ / .bash_profile). Cuối cùng, điều này dường như không hoạt động cho PATH trên El Capitan và Sierra. Điều đó cần được đặt thông qua 'launchctl config đường dẫn người dùng ...' và trong / etc / path.
UseSanitizedBuildSystemEnvironment
).
[ Câu trả lời gốc ]: Bạn vẫn có thể sử dụnglaunchctl setenv variablename value
để đặt biến sao cho tất cả các ứng dụng được chọn (các ứng dụng đồ họa được khởi động qua Dock hoặc Spotlight, ngoài các biến được bắt đầu qua thiết bị đầu cuối).
Rõ ràng là bạn sẽ không muốn làm điều này mỗi khi bạn đăng nhập.
[ Chỉnh sửa ]: Để tránh điều này, hãy khởi chạy AppleScript Editor
, nhập một lệnh như thế này:
do shell script "launchctl setenv variablename value"
(Sử dụng nhiều dòng nếu bạn muốn đặt nhiều biến)
Bây giờ lưu ( ⌘
+ s
) dưới định dạng Tệp: Ứng dụng . Cuối cùng mở System Settings
→ Người dùng & Nhóm → Mục đăng nhập và thêm ứng dụng mới của bạn.
[ Câu trả lời gốc ]: Để xử lý xung quanh vị trí này, tất cả các biến bạn muốn xác định trong tập lệnh shell ngắn, sau đó hãy xem câu trả lời trước đó về cách chạy tập lệnh khi đăng nhập MacOS . Bằng cách đó, tập lệnh sẽ được gọi khi người dùng đăng nhập.
[ Chỉnh sửa ]: Không có giải pháp nào là hoàn hảo vì các biến sẽ chỉ được đặt cho cụ thể đó người dùng nhưng tôi hy vọng / đoán đó có thể là tất cả những gì bạn yêu cầu.
Nếu bạn có nhiều người dùng, bạn có thể đặt Mục đăng nhập theo cách thủ công cho từng người trong số họ hoặc đặt một bản sao com.user.loginscript.plist trong mỗi Thư viện / LaunchAgents cục bộ của họ , chỉ vào cùng một tập lệnh shell.
Cấp, cả hai cách giải quyết này đều không thuận tiện như /etc/launchd.conf .
[ Chỉnh sửa thêm ]: Một người dùng bên dưới đề cập rằng điều này không hiệu quả với anh ta. Tuy nhiên tôi đã thử nghiệm trên nhiều máy Yosemite và nó hoạt động với tôi. Nếu bạn gặp sự cố, hãy nhớ rằng bạn sẽ cần khởi động lại các ứng dụng để việc này có hiệu lực. Ngoài ra, nếu bạn đặt biến trong thiết bị đầu cuối thông qua ~ / .profile hoặc ~ / .bash_profile , chúng sẽ ghi đè lên những thứ được đặt thông qua launchctl setenv cho các ứng dụng được khởi động từ trình bao .
Có thể đặt biến môi trường trên Mac OS X 10.10 Yosemite với 3 tệp + 2 lệnh.
Tệp chính với định nghĩa biến môi trường:
$ ls -la /etc/environment
-r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment
$ cat /etc/environment
#!/bin/sh
set -e
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start"
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv MAVEN_HOME /opt/local/share/java/maven3
if [ -x /usr/libexec/path_helper ]; then
export PATH=""
eval `/usr/libexec/path_helper -s`
launchctl setenv PATH $PATH
fi
osascript -e 'tell app "Dock" to quit'
syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete"
Định nghĩa dịch vụ để tải các biến môi trường cho các ứng dụng người dùng (terminal, IDE, ...):
$ ls -la /Library/LaunchAgents/environment.user.plist
-rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist
$ sudo cat /Library/LaunchAgents/environment.user.plist
<?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>environment.user</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
Định nghĩa dịch vụ tương tự cho các ứng dụng người dùng root:
$ ls -la /Library/LaunchDaemons/environment.plist
-rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist
$ sudo cat /Library/LaunchDaemons/environment.plist
<?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>environment</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
Và cuối cùng chúng ta nên đăng ký các dịch vụ này:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Những gì chúng ta nhận được:
Vấn đề / vấn đề:
Để các biến env của bạn được các ứng dụng lấy chính xác sau khi khởi động lại hệ thống bạn sẽ cần:
Điều này xảy ra do Apple từ chối đặt hàng rõ ràng các dịch vụ được tải, vì vậy các biến env được đăng ký song song với việc xử lý "hàng đợi mở lại".
Nhưng thực tế, tôi khởi động lại hệ thống của mình chỉ vài lần mỗi năm (trên các bản cập nhật lớn), vì vậy nó không phải là vấn đề lớn.
JAVA_HOME
), nhưng không phải cho PATH
biến (xem câu hỏi của tôi khi hỏi khác nhau ).
launchd
, nhưng không thể tải các Daemon đó khi khởi động (tức là trước khi đăng nhập)? Điều đó sẽ phá vỡ tất cả các vấn đề bạn đề cập.
Trích dẫn từ
Apple Developer Relations
10-Oct-2014 09:12 PM
Sau nhiều lần cân nhắc, kỹ thuật đã loại bỏ tính năng này. Các tập tin
/etc/launchd.conf
đã được cố ý loại bỏ vì lý do bảo mật. Như một giải pháp thay thế, bạn có thể chạylaunchctl limit
root sớm trong khi khởi động, có lẽ từ aLaunchDaemon
. (...)
Giải pháp:
Đặt mã vào
/Library/LaunchDaemons/com.apple.launchd.limit.plist
bằng bash-script:
#!/bin/bash
echo '<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>core</string>
<string>unlimited</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist
/Library/LaunchDaemons
và thay vì bảo launchctl
chạy limit
lệnh, hãy bảo nó chạy setenv
lệnh với PATH
và một chuỗi đường dẫn làm đối số. launchd
nên tự động lấy nó khi khởi động và nhận loại tự sửa đổi gần như ngay lập tức.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Dưới đây là các lệnh để khôi phục hành vi cũ:
# create a script that calls launchctl iterating through /etc/launchd.conf
echo '#!/bin/sh
while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf;
' > /usr/local/bin/launchd.conf.sh
# make it executable
chmod +x /usr/local/bin/launchd.conf.sh
# launch the script at startup
echo '<?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>launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/usr/local/bin/launchd.conf.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist
Bây giờ bạn có thể chỉ định các lệnh như setenv JAVA_HOME /Library/Java/Home
trong /etc/launchd.conf
.
Đã kiểm tra trên El Capitan.
Điều gì đã làm việc cho tôi (lấy cảm hứng từ aax 'cảm ơn):
Dán cái này vào / L Library / LaDDaemons / com.apple.launchd.limit.plist sau đó khởi động lại:
<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>16384</string>
<string>16384</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Nếu bạn cần nó từng bước:
⌘+v
). Điều này sẽ buộc giới hạn ở 16384 tệp trên mỗi quy trình và tổng số 16384 tệpesc
sau đó:wq
Tôi hy vọng điều này đã giúp bạn.
Bạn có thể thử https://github.com/ersiner/osx-env-sync . Nó xử lý cả hai dòng lệnh và ứng dụng GUI từ một nguồn duy nhất và hoạt động cùng với phiên bản OS X mới nhất (Yosemite) mới nhất.
Bạn có thể sử dụng thay thế đường dẫn và các thủ thuật shell khác vì những gì bạn viết là tập lệnh bash thông thường sẽ có nguồn gốc từ bash ở vị trí đầu tiên. Không có giới hạn .. (Kiểm tra tài liệu đồng bộ hóa osx-env và bạn sẽ hiểu làm thế nào nó đạt được điều này.)
Tôi đã trả lời một câu hỏi tương tự ở đây nơi bạn sẽ tìm thấy nhiều hơn.
Giải pháp là thêm biến của bạn vào /etc/profile
. Sau đó, mọi thứ hoạt động như mong đợi! Tất nhiên bạn PHẢI làm điều đó như một người dùng root với sudo nano / etc / profile. Nếu bạn chỉnh sửa nó bằng bất kỳ cách nào khác, hệ thống sẽ khiếu nại với cấu hình / etc / profile bị hỏng, ngay cả khi bạn thay đổi quyền thành root.
Tôi đã thêm các biến trong ~ / .bash_profile theo cách sau. Sau khi bạn hoàn thành khởi động lại / đăng xuất và đăng nhập
export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3
export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4
launchctl setenv M2_HOME $M2_HOME
launchctl setenv ANT_HOME $ANT_HOME
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin
launchctl setenv PATH $PATH
LƯU Ý: không cần khởi động lại / đăng xuất và đăng nhập, bạn có thể áp dụng những thay đổi này bằng cách sử dụng;
source ~/.bash_profile