Đặt các biến môi trường trong OS X cho các ứng dụng GUI


18

Làm cách nào để thiết lập các biến môi trường trong Mac OS X sao cho chúng có sẵn cho các ứng dụng GUI mà không cần sử dụng ~ / .MacOSX / môi trường.plist hoặc Đăng nhập móc (vì chúng không được dùng nữa )?


@ ersin-er Câu trả lời từ StackOverflow "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 Yosemite & El Capitan)" có thể khiến mọi người quan tâm đến câu hỏi này.
l --marc l

Câu trả lời:


16

Trên Mountain Lion tất cả /etc/paths/etc/launchd.confchỉnh sửa không có hiệu lực!

Diễn đàn nhà phát triển của Apple cho biết:

"Thay đổi Info.plist của chính .app để chứa từ điển" LSEn Môi trường "với các biến môi trường bạn muốn.

~ / .MacOSX / môi trường.plist không còn được hỗ trợ. "

Vì vậy, tôi đã trực tiếp chỉnh sửa ứng dụng Info.plist(nhấp chuột phải vào "AppName.app" (trong trường hợp này là SourceTree) và sau đó " Show package contents")

Xem Nội dung đóng gói

và thêm một cặp khóa / dict mới gọi là:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(xem: Tài liệu LaunchServiceKeys tại Apple )

nhập mô tả hình ảnh ở đây

bây giờ Ứng dụng (trong trường hợp của tôi là SourceTree) sử dụng đường dẫn đã cho và hoạt động với git 1.9.3 :-)

PS: Tất nhiên bạn phải điều chỉnh mục Đường dẫn theo nhu cầu đường dẫn cụ thể của mình.


1
Cảm ơn bạn! Điều này là hoàn hảo cho tôi. Vào ngày 10.11 (El Capitan) tôi cũng phải chạy các lệnh do Matthew cung cấp để xem các thay đổi của tôi Info.plistcó hiệu lực.
DSedivec

8

Giải pháp sử dụng chức năng của launchctl, kết hợp với Launch Agent để bắt chước các móc đăng nhập cũ. Đối với các giải pháp khác sử dụng cửa hàng của launchd, xem so sánh này . Tác nhân khởi chạy được sử dụng ở đây nằm 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>Label</key>
    <string>user.conf.launchd</string>
    <key>Program</key>
    <string>/Users/Shared/conflaunchd.sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/.conf.launchd</string>
    </array>
    <key>EnableGlobbing</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>LimitLoadToSessionType</key>
    <array>
        <string>Aqua</string>
        <string>StandardIO</string>
    </array>
</dict>
</plist>

Một điều quan trọng là khóa RunAtLoad để tác nhân khởi chạy được thực thi trong thời gian sớm nhất có thể. Công việc thực sự được thực hiện trong tập lệnh shell /Users/Shared/conflaunchd.sh , đọc ~ / .conf.launchd và đưa nó vào launchctl:

#! /bin/bash

#filename="$1"
filename="$HOME/.conf.launchd"

if [ ! -r "$filename" ]; then
    exit
fi

eval $(/usr/libexec/path_helper -s)

while read line; do
    # skip lines that only contain whitespace or a comment
    if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi

    eval launchctl $line
done <"$filename"

exit 0

Chú ý cuộc gọi của path_helperđể thiết lập PATH ngay. Cuối cùng, ~ / .conf.launchd trông như thế

setenv PATH ~/Applications:"${PATH}"

setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:

# Locale
setenv LANG en_US.UTF-8

Đây là launchctlcác lệnh, xem trang chủ của nó để biết thêm thông tin. Hoạt động tốt đối với tôi (tôi nên đề cập đến mà tôi vẫn là một chàng trai Snow Leopard), giao diện ứng dụng như texstudioTeXShop thể nhìn thấy cây tex của riêng tôi. Những điều có thể được cải thiện:

  1. Kịch bản shell có một #filename="$1"trong đó. Điều này không phải là ngẫu nhiên, vì tên tệp nên được đưa vào tập lệnh bởi tác nhân khởi chạy làm đối số, nhưng điều đó không hoạt động.

  2. Như đã đề cập ở đây (tiếng Đức và đằng sau một tường thành!), Có thể đặt tập lệnh vào chính tác nhân khởi chạy.

  3. Tôi không chắc chắn mức độ an toàn của giải pháp này, vì nó sử dụng evalvới các chuỗi do người dùng cung cấp.

  4. Tôi nghĩ cần nhớ rằng định nghĩa về MANPATH sử dụng phương pháp này không hoạt động tốt, nhưng tôi không chắc chắn.

Cần phải đề cập rằng Apple dự định một cách tiếp cận có phần tương tự bằng cách đưa nội dung vào ∼ / launchd.conf , nhưng hiện tại nó không được hỗ trợ cho đến ngày nay và HĐH (xem trang chủ của launchd.conf). Tôi đoán rằng những thứ như Globing sẽ không hoạt động như họ làm trong đề xuất này. Và tất nhiên người ta có thể đặt các tệp này ở bất kỳ nơi nào khác, ngoại trừ tác nhân khởi chạy phải nằm trong / Library / LaunchAgents / hoặc ~ / Library / LaunchAgents / .

Cuối cùng, tôi nên đề cập đến các nguồn tôi đã sử dụng làm thông tin về Đại lý khởi động: 1 , 2 , 3 , 4 .

Cập nhật : Điều này không hoạt động trong phiên bản 10.8 tại thời điểm này. Giải pháp trên cơ sở cho mỗi ứng dụng được mô tả ở đâyđây .


Nhân tiện, nếu ai đó muốn xác định Biến PATH trong môi trường Terminal và sử dụng tác nhân khởi chạy này, tôi đề nghị viết export PATH=.:"$(launchctl getenv PATH)"vào ~ / .bash_profile (tương tự cho các shell khác). Điều này là có thể vì path_helperđược gọi trong kịch bản shell. Để biết thêm chi tiết về biến PATH trong OS X, hãy kiểm tra câu trả lời này .
trăm Ulysses

3

Câu trả lời do @flori cung cấp cho tôi trên Maverick với điều kiện tôi chạy các lệnh sau trong Terminal sau khi thay đổi tệp plist

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder

Tôi đã có hành vi tương tự với El Capitan và tôi đã thêm điểm của bạn vào câu trả lời của @ flori
Seki

2

Câu trả lời được cung cấp bởi @ percival-ulyskes hoạt động với tôi trên 10.9 Mavericks với thay đổi nhỏ sau: chỉnh sửa /Users/Shared/conflaunchd.sh script ngay trước đó exit 0và thêm các dòng

killall Dock
killall SystemUIServer

để khởi động lại Dock và thanh thực đơn. Sau đó, các ứng dụng bắt đầu từ Dock hoặc từ Spotlight sẽ kế thừa PATH chính xác. Nếu bạn sử dụng Finder để khởi động các ứng dụng quan trọng PATH, thì killall Findercũng có thể được thêm vào.

Trong dòng .bash_profiletôi sử dụng

export PATH=`launchctl getenv PATH`

để đặt PATH cho Terminal, theo cách này, PATH được điều khiển từ cùng một vị trí, tệp ~ / .conf.launchd .


0

Một lựa chọn khác là sử dụng /etc/launchd.conf. Ví dụ: tôi đã thay đổi mặc định PATHbằng cách thêm dòng này vào /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Bạn có thể áp dụng các thay đổi /etc/launchd.confbằng cách khởi động lại hoặc bằng cách chạy launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confvà kết thúc và khởi chạy lại các quy trình.

Cài đặt /etc/launchd.confáp dụng cho cả quy trình launchd gốc và quy trình launchd cho mỗi người dùng. Các biến môi trường được đặt với setenvin /etc/launchd.confđược hiển thị bởi cả hai sudo launchctl exportlaunchctl export.

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.