Làm cách nào để đặt biến môi trường PATH toàn cầu trên OS X?


101

Tôi muốn thêm vào biến môi trường PATH toàn cầu trên OS X để tất cả các vỏ người dùng và ứng dụng GUI có cùng môi trường PATH.

Tôi biết tôi có thể nối vào đường dẫn trong các kịch bản khởi động shell, nhưng các cài đặt đó không được kế thừa bởi các ứng dụng GUI.

Cách duy nhất tôi tìm thấy cho đến nay là xác định lại biến môi trường PATH trong /etc/launchd.conf :

setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/my/path

Tôi không thể tìm ra một cách để thực sự gắn vào PATH launchd.conf.

Tôi hơi lo lắng về phương pháp này, nhưng cho đến nay đây là điều duy nhất hoạt động. Có cách nào tốt hơn?



2
Đối với Yosemite và sau đó, thấy stackoverflow.com/questions/25385934/...
thSoft

Không có câu trả lời nào ở đây giải quyết câu hỏi của OP. Nhưng nhận xét ở đây của thSoft là đúng về tiền! Có lẽ điều này nên được hợp nhất hoặc liên kết với câu hỏi được tham chiếu đó: stackoverflow.com/questions/25385934/ mẹo
Kevin Buchs

Câu trả lời:


71

Thông tin GUI của palmer là chính xác, nhưng có một cách dễ bảo trì hơn để sửa đổi đường dẫn mà trình bao thấy. Giống như mediaslave đã nói , bạn có thể chỉnh sửa /etc/paths, nhưng thậm chí tốt hơn bạn có thể thả một tệp văn bản trong /etc/paths.d/đó có một đường dẫn trong đó và tất cả các shell sẽ xây dựng đường dẫn chính xác.

Ví dụ: trên hệ thống của tôi:

$ cat /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
$ ls /etc/paths.d
X11       git      postgres
$ cat /etc/paths.d/postgres
/Library/PostgreSQL/8.4/bin
$ echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Library/PostgreSQL/8.4/bin:/usr/X11/bin:/usr/local/mysql/bin

1
Rất vui, cảm ơn! Lưu ý: điều này đòi hỏi bạn phải đăng xuất và đăng nhập lại trước khi nó hoạt động.
weronika

@weronika: Tôi thấy nó là đủ để thoát và khởi chạy lại X11(ít đau đớn hơn đăng xuất hoàn toàn). Tôi đã không thử nó trong Terminal.
Peter Gluck

Tôi đã đề cập đến Terminal - bạn nói đúng, tôi quên chỉ định.
weronika

8
Điều này là tốt để biết, nhưng nó không trả lời câu hỏi của OP ở chỗ cơ chế này không áp dụng cho các ứng dụng GUI. OP đang tìm kiếm một giải pháp hợp nhất cho phép anh ta nối vào mặc định $PATH.
mkuity

"hệ thống của tôi" ở đây có ý nghĩa gì, @cogg? Không phải tất cả chúng ta đều sử dụng OS X ở đây sao? Xin lỗi nhưng tôi vẫn chưa quen với OS X. Tôi đang sử dụng OS X 10.7
ericn

48

/etc/launchd.conf

Các launchd.conftập tin là ** các giải pháp hoàn chỉnh duy nhất mà sẽ làm việc cho cả hai dòng lệnh và giao diện đồ họa ứng dụng trên OS X v10.8 (Mountain Lion) và v10.9 (Mavericks), một trong đó sẽ làm việc với giao diện đồ họa và giao diện điều khiển ứng dụng, cho tất cả người dùng .

sudo touch /etc/launchd.conf
sudo nano /etc/launchd.conf

Thêm vào

setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Trong ví dụ trên tôi đã thêm /usr/local/binvào các giá trị môi trường mặc định cho PATH.

Hãy nhớ rằng tệp này không phải là tập lệnh và bạn không có tùy chọn để sử dụng thay thế. Ngoài ra, để áp dụng những điều này, bạn cần khởi động lại.

Hãy nhớ rằng, tất cả những thứ khác chỉ là một phần giải pháp:

  • environment.plist không hoạt động cho các ứng dụng được khởi chạy qua Spotlight.
  • /etc/paths - chỉ dành cho bảng điều khiển
  • /etc/csh.cshrchoặc /etc/bashrc- chỉ đối với một số vỏ

Câu trả lời này được dựa trên cùng một câu hỏi từ Thiết biến môi trường trên Mac OS X .


7
Phát hiện tuyệt vời, nhưng câu hỏi đã nói về launchd và đang hỏi về cách nối vào đường dẫn trong đó.
cregox

21
Bạn đã thực sự thêm một bình luận cho câu hỏi ban đầu chỉ ra mình là "câu trả lời thực sự" chưa?
TJ Luoma

7
Nó được ngụ ý bởi câu trả lời - hữu ích - của bạn, nhưng chỉ để đánh vần nó: mong muốn của OP để nối vào đường dẫn mặc định không được hỗ trợ, vì bạn không thể tham chiếu các biến môi trường khác /etc/launchd.conf.
mkuity

Nó không phải là toàn cầu - môi trường dòng lệnh sẽ loại bỏ điều này khi / etc / profile gọi path_helper và xây dựng lại PATH từ / etc / path và /etc/paths.d/
Dave X

1
theo apple.stackexchange.com/questions/106355/ , điều này không còn hiệu quả đối với Yosemite hoặc sau này
ericn

7

Bạn sẽ phải đặt nó trên cơ sở từng lớp một; Các shell giống Bash và csh không chia sẻ cùng một tệp cấu hình và cú pháp để điều chỉnh PATH.

Cố gắng làm điều này trong launchctlsẽ không hoạt động, bởi vì các biến môi trường được đặt khi đăng nhập; chúng không tồn tại hệ thống rộng rãi trong Unix ngoài phiên shell.

Vì vậy, bạn sẽ muốn thêm

setenv PATH "$PATH:/add/my/extra/path"

đến /etc/csh.cshrc

export PATH="$PATH:/more/paths:/

để /etc/bashrc.

Nếu bạn muốn các biến môi trường trong các ứng dụng GUI, điều đó phức tạp hơn. Bạn phải tạo một .MacOSX/environment.plisttệp trong thư mục nhà của mỗi người dùng. Thư mục .MacOSXcó thể sẽ không tồn tại theo mặc định, vì vậy bạn sẽ phải tạo nó.

Định dạng của tệp là như vậy:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

    <key>PRINTER</key>
    <string>myprinter</string>

    <key>PATH</key>
    <string>/path/to/thing/I/need</string>

    <key>DISPLAY</key>
    <string>0:1</string>

</dict>
</plist>

Thêm vào environment.plist là trên trang web của Apple .


Nhưng các cài đặt có hiệu lực khi được đặt trong /etc/launchd.conf ... Hmmm ... / tôi bị nhầm lẫn.
Xerxes

Có thật không? Biến môi trường nào bạn đang đặt ở đó?
palmer

1
Chỉ là một bản cập nhật kể từ OS X 10.8: ~/.MacOSX/environment.plistcách tiếp cận không còn được hỗ trợ và không có sự thay thế nào ở cấp độ người dùng. Toàn hệ thống bạn có thể sử dụng /etc/launchd.conf(và có giải pháp ứng dụng cho mỗi - *.).
mkuity

Không trả lời câu hỏi của OP.
Kevin Buchs

3

Bạn có thể chỉnh sửa đường dẫn toàn cầu của mình bằng cách thêm các dòng vào /etc/paths, một đường dẫn trên mỗi dòng.

sudo nano /etc/paths sẽ đưa bạn đến đó


2
Điều này là tốt để biết, nhưng nó không trả lời câu hỏi của OP ở chỗ cơ chế này không áp dụng cho các ứng dụng GUI.
mkuity


1

Tôi không chắc chắn nếu có ai bao quát cách đơn giảnthanh lịch nhất. Ít nhất là trên Mac OS X v10.6 (Báo tuyết).

Can thiệp vào [/etc/|~/.]các [profile|bashrc]file có thể làm việc, nhưng nó phần nào của một hack. Thư mục /etc/paths.d/là cách để đi:

  • Sudo vào trình soạn thảo yêu thích của bạn.
  • Tạo một tệp mới có tên *name*(chỉ không đặt tên nó là một cái gì đó đã có trong đó) /etc/paths.d/với một đường dẫn trên mỗi dòng:

    /usr/X11/bin
    /Developer/usr/bin
    
  • Sau đó thêm

    eval '/usr/libexec/path_helper -s`
    

    đến profilehoặc bashrc, và bạn nên đi tốt.


1
Điều này là tốt để biết, nhưng nó không trả lời câu hỏi của OP ở chỗ cơ chế này không áp dụng cho các ứng dụng GUI.
mkuity

Là tên tập tin theo nghĩa đen *name*? Hay bạn có nghĩa là chỉ name?
Peter Mortensen

0

Tôi không chắc nếu launchd chấp nhận điều này, nhưng hãy thử:

setenv PATH "$ PATH: / my / path"

1
Thật không may, điều đó không làm việc. Có vẻ như launchctl có quyền truy cập vào các biến môi trường dễ dàng. Có một lệnh để lấy các biến môi trường, nhưng hoàn toàn không có tài liệu nào về cách sử dụng nó.
lajos

0

Tôi không chắc tại sao bạn lại sử dụng /etc/launchd.conftrái ngược với /etc/profile- nhưng tôi không phải là chuyên gia về Mac OS X - Tôi tin bạn rằng tôi chắc chắn rằng nó hoạt động, nhưng launchdlà triển khai / thay thế Mac OS X cho init- Mac OS X làm tôi bối rối.

Dù sao, setenv PATH "$PATH:/more/paths:/and/more/paths"sẽ hoạt động (tcsh), và vỏ bẻ khóa tương đương là export PATH="$PATH:/more/paths:/and/more/paths"- Tôi không biết làm thế nào launchdcó liên quan đến một vỏ cụ thể.

Tôi nghĩ rằng tôi đã hỏi nhiều câu hỏi hơn sau đó tôi đã trả lời =)


4
/ etc / cài đặt đường dẫn hồ sơ không được nhìn thấy bởi bất kỳ ứng dụng GUI OS X nào. Điều đó chỉ áp dụng cho bash. Tôi muốn tất cả các ứng dụng để có được thiết lập đường dẫn mới.
lajos

1
Unix? Chắc chắn, đó là unix. Ý tôi là, sắp xếp Vâng, chúng tôi đã phá vỡ những thứ đã hoạt động trong 30 năm, nhưng nó vẫn còn nguyên! / thở dài
Matt Simmons
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.