Biến môi trường trong Mac OS X


186

Cập nhật: Liên kết dưới đây không có câu trả lời đầy đủ . Phải đặt đường dẫn hoặc biến ở hai vị trí (một cho GUI và một cho shell) là khập khiễng.

Không trùng lặp : Đặt biến môi trường trong OS X?


Đến từ nền tảng Windows, nơi rất dễ cài đặt và sửa đổi các biến môi trường (chỉ cần đi tới Thuộc tính hệ thống> Nâng cao> Biến môi trường), dường như điều đó không đơn giản như vậy trên Mac OS 10.5. Hầu hết các tài liệu tham khảo nói rằng tôi nên cập nhật / etc / profile hoặc ~ / .profile. Đây có phải là tương đương với Biến hệ thống và Biến người dùng không? Ví dụ, tôi nên đặt JAVA_HOMEbiến ở đâu?


BIÊN TẬP:

Tôi muốn có thể truy cập biến từ thiết bị đầu cuối cũng như một ứng dụng như Eclipse. Ngoài ra, tôi hy vọng tôi không phải khởi động lại / đăng xuất để thực hiện điều này.


Và có một số lời khuyên trong các câu trả lời cho câu hỏi liên kết không được lặp lại ở đây ...
dmckee --- ex-moderator mèo con

Câu trả lời:


142

Không cần sao chép. Bạn có thể đặt các biến môi trường được sử dụng bởi launchd (và các tiến trình con, tức là mọi thứ bạn bắt đầu từ Spotlight) bằng cách sử dụng launchctl setenv.

Ví dụ: nếu bạn muốn phản chiếu đường dẫn hiện tại của mình trong launchd sau khi thiết lập nó ở .bashrcbất cứ đâu:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Biến môi trường không được tự động cập nhật trong các ứng dụng đang chạy. Bạn sẽ cần khởi chạy lại các ứng dụng để có được các biến môi trường được cập nhật (mặc dù bạn chỉ có thể đặt các biến trong trình bao của mình, ví dụ: PATH=whatever:you:wantkhông cần phải khởi chạy lại thiết bị đầu cuối).


1
Có vẻ như câu trả lời tốt nhất cho đến nay, không cần ứng dụng bên thứ 3!
Abdullah Jibaly

2
Điều này dường như không phải là toàn cầu: các biến môi trường được đặt theo cách này là cục bộ cho người dùng. Chúng ta vẫn chưa có cơ chế toàn cầu để thiết lập biến môi trường.
Andrew

@Andrew Ý bạn là gì, cục bộ với người dùng? Tôi hy vọng tất cả các quy trình sau đó bắt đầu từ launchd sẽ bị ảnh hưởng.
Matt Curtis

@MattCurtis: Các biến môi trường được đặt qua launchctl setenvdường như chỉ hiển thị cho người dùng thực hiện thay đổi. Nếu tôi đặt một biến là một người dùng thông thường, nó sẽ không hiển thị với root (thông qua sudo) và ngược lại.
Andrew

2
@Andrew OK, root có launchd riêng - ps aux | grep launchdsẽ hiển thị điều này. Đồng thời kiểm tra xem man sudotài liệu nào sudo(theo mặc định) cố tình đặt lại môi trường - nếu bạn sudo -Esẽ bảo vệ môi trường (bao gồm các biến bạn đã đặt launchctl setenv). Bạn có một ứng dụng thực tế cho việc này không? Nếu vậy, phương pháp này có hiệu quả với bạn không?
Matt Curtis

298

Có một số nơi bạn có thể đặt các biến môi trường.

  • ~/.profile: sử dụng điều này cho các biến bạn muốn đặt trong tất cả các chương trình được khởi chạy từ thiết bị đầu cuối (lưu ý rằng, không giống như trên Linux, tất cả các shell được mở trong Terminal.app đều là các shell đăng nhập).
  • ~/.bashrc: điều này được gọi cho các shell không phải là shell đăng nhập. Sử dụng điều này cho các bí danh và những thứ khác cần được xác định lại trong các lớp con, không phải cho các biến môi trường được kế thừa.
  • /etc/profile: cái này được tải trước ~ / .profile, nhưng nếu không thì tương đương. Sử dụng nó khi bạn muốn biến áp dụng cho các chương trình đầu cuối được khởi chạy bởi tất cả người dùng trên máy (giả sử họ sử dụng bash).
  • ~/.MacOSX/environment.plist: cái này được đọc bởi loginwindow khi đăng nhập. Nó áp dụng cho tất cả các ứng dụng, bao gồm cả những ứng dụng GUI, ngoại trừ những ứng dụng được Spotlight khởi chạy trong 10.5 (không phải 10.6). Nó yêu cầu bạn phải đăng xuất và đăng nhập lại để các thay đổi có hiệu lực. Tệp này không còn được hỗ trợ kể từ OS X 10.8.
  • launchdVí dụ người dùng của bạn : điều này áp dụng cho tất cả các chương trình do người dùng, GUI và CLI khởi chạy. Bạn có thể áp dụng các thay đổi bất cứ lúc nào bằng cách sử dụng setenvlệnh trong launchctl. Về lý thuyết , bạn sẽ có thể đặt setenvcác lệnh vào ~/.launchd.conflaunchdsẽ tự động đọc chúng khi người dùng đăng nhập, nhưng trong thực tế, hỗ trợ cho tệp này không bao giờ được thực hiện. Thay vào đó, bạn có thể sử dụng một cơ chế khác để thực thi tập lệnh khi đăng nhập và có lệnh gọi tập lệnh đó launchctlđể thiết lập launchdmôi trường.
  • /etc/launchd.conf: điều này được đọc bởi launchd khi hệ thống khởi động và khi người dùng đăng nhập. Chúng ảnh hưởng đến mọi quy trình đơn lẻ trên hệ thống, vì launchd là quá trình root. Để áp dụng các thay đổi cho launchd gốc đang chạy, bạn có thể chuyển các lệnh vào sudo launchctl.

Những điều cơ bản cần hiểu là:

  • các biến môi trường được kế thừa bởi con của một tiến trình tại thời điểm chúng được rẽ nhánh.
  • quá trình root là một cá thể launchd và cũng có một cá thể launchd riêng cho mỗi phiên người dùng.
  • launchd cho phép bạn thay đổi các biến môi trường hiện tại bằng cách sử dụng launchctl; các biến được cập nhật sau đó được kế thừa bởi tất cả các quy trình mới mà nó tạo ra từ đó trở đi.

Ví dụ về thiết lập biến môi trường với launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Bây giờ, hãy khởi chạy ứng dụng GUI sử dụng biến và voila!

Để giải quyết vấn đề ~/.launchd.confkhông hiệu quả, bạn có thể đặt đoạn mã sau vào ~/Library/LaunchAgents/local.launchd.conf.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>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Sau đó, bạn có thể đặt setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEbên trong ~/.launchd.conf, và nó sẽ được thực hiện tại mỗi lần đăng nhập.

Lưu ý rằng, khi đưa một danh sách lệnh vào launchctl theo kiểu này, bạn sẽ không thể đặt các biến môi trường với các giá trị chứa khoảng trắng. Nếu bạn cần làm như vậy, bạn có thể gọi launchctl như sau : launchctl setenv MYVARIABLE "QUOTE THE STRING".

Ngoài ra, lưu ý rằng các chương trình khác chạy khi đăng nhập có thể thực thi trước khi khởi chạy và do đó có thể không thấy các biến môi trường mà nó đặt.


3
Trên thực tế, về ~/.MacOSX/environment.plistLion của tôi, nó được đọc và sử dụng. Chỉ cần thử nghiệm nó. Tôi thực sự thích nó hơn .launchd.conf vì tôi sử dụng khung tùy chọn RCen môi trường để duy trì nó.
Gilimanjaro

5
Không thể ~/.launchd.conflàm việc vào ngày 10.6.8 - nó dường như không có hiệu lực. Ngoài ra trang man cho biết tập tin này hiện không được hỗ trợ.
snowcrash09

4
~ / .launchd.conf dường như không làm việc trên 10.7.3 hoặc và khi tôi nhìn trong man page của nó nói $ / .launchd.conf tập HOME của bạn launchd cấu hình (hiện không được hỗ trợ)
không sáng tạo

4
Trong 10.8 (Mountain Lion), ~ / .MacOSX / môi trường.plist không còn được hỗ trợ. Theo Apple Dev, người ta phải "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." Để biết thêm thông tin, hãy xem apple.stackexchange.com/questions/57385/ trên
pnkfelix

3
@LaC Bài đăng tuyệt vời, toàn diện; bạn có thể vui lòng cập nhật nó để lưu ý rằng ~/.launchd.confvẫn không được hỗ trợ và không hoạt động kể từ OS X 10.8.3? Xemman launchd.conf
mkuity0

12

Tôi nghĩ những gì OP đang tìm kiếm là một giải pháp đơn giản, giống như cửa sổ.

ở đây ya đi:

https://www.macupdate.com/app/mac/14617/rcen môi trường


1
Wow, điều này có vẻ mát mẻ. chưa thử nhưng có vẻ chính xác những gì tôi cần từ mô tả.
Abdullah Jibaly

6
Tuy nhiên, liên kết ban đầu dường như đã bị hỏng kể từ khi tôi đăng nó (vấn đề của Apple là gì? 301 có đắt không?). Bạn có thể sử dụng liên kết này thay thế: macupdate.com/app/mac/14617/rcen môi trường
Tom Teman

Điều này thực sự cũ. Kiểm tra câu trả lời khác đề cập đến osx-env-sync cho một giải pháp hiện đại hoạt động ngay cả trong OS X 10.10 (Yosemite) trở lên.
Warren P

Hãy tóm tắt thông tin từ liên kết trong câu trả lời của bạn. Như chúng ta đã thấy, các liên kết bị phá vỡ vì nhiều lý do.
dùng3,1415927

7

Bạn có thể đọc lên linux, khá gần với Mac OS X. Hoặc bạn có thể đọc lên BSD Unix, gần hơn một chút. Đối với hầu hết các phần, sự khác biệt giữa Linux và BSD không nhiều.

/etc/profile là các biến môi trường hệ thống.

~/.profile là các biến môi trường cụ thể của người dùng.

"Tôi nên đặt biến JAVA_HOME của mình ở đâu?"

  • Bạn có nhiều người dùng? Họ có quan tâm không? Bạn có làm phiền một số người dùng khác bằng cách thay đổi một /etc/profile?

Nói chung, tôi không muốn gây rối với các cài đặt toàn hệ thống mặc dù tôi là người dùng duy nhất. Tôi thích chỉnh sửa các thiết lập địa phương của tôi.


5

Đối với các ứng dụng GUI, bạn sẽ phải tạo và chỉnh sửa ~/.MacOSX/environment.plist. Thêm chi tiết tại đây . Bạn sẽ cần phải đăng xuất để những thứ này có hiệu lực. Tôi không chắc liệu chúng có ảnh hưởng đến các ứng dụng được khởi chạy từ Terminal hay không, nhưng tôi cho rằng chúng sẽ như vậy.

Đối với các ứng dụng được khởi chạy từ Terminal, bạn cũng có thể chỉnh sửa tệp ~ / .profile.


2
Có, Terminal sẽ kế thừa các biến, như mọi thứ được khởi chạy từ Terminal. Bạn có thể sử dụng ngăn tùy chọn RCen môi trường để duy trì các biến.
Gilimanjaro

1
Giải pháp này không còn hoạt động với một số phiên bản của Mac OS X v10.7. Nó không có bất kỳ sửa đổi nào của Mac OS X v10.8 trở lên. Thay vào đó, hãy xem: stackoverflow.com/a/4567308/543738
LS

3

Chỉ cần mở ~/.profiletệp, thông qua nanoTerminal và gõ vào đó:

export PATH=whatever/you/want:$PATH

Lưu tệp này (cmd + X và Y). Sau đó, vui lòng đăng xuất / đăng nhập lại hoặc chỉ cần mở một tab mới trong Terminal và thử sử dụng biến mới của bạn.

VUI LÒNG KHÔNG quên thêm ": $ PATH" sau bất cứ điều gì / bạn / muốn, nếu không, bạn sẽ xóa tất cả các đường dẫn trong biến PATH, trước đó.


4
Điều này chỉ áp dụng cho môi trường lệnh bash. Các biến bạn đặt ở đây không được các ứng dụng GUI nhìn thấy.
Warren P

3

Đồng bộ hóa các biến môi trường OS X cho các ứng dụng dòng lệnh và GUI từ một nguồn duy nhất với osx-env-sync .

Tôi cũng đã đăng một câu trả lời cho một câu hỏi liên quan ở đây .


Cái này thật tuyệt. Gợi ý: Đặt điều khởi động unloadl / launcl tải "refresh now" vào một tập lệnh. Tôi gọi nó là osx-env-sync-now.sh. Tôi sửa đổi .bash_profile của mình và chạy tập lệnh "refresh now" nhỏ và tiếp tục. Tôi nghĩ rằng có ý nghĩa bảo mật ở đây, vì vậy tôi nghĩ rằng một số hạn chế nên được thực hiện. Phải có lý do họ tắt khả năng này trong OS X.
Warren P

@WarrenP Xong! Kiểm tra repo.
Ersin Er

Thông minh. Điều này giải quyết rất nhiều nỗi đau cho tôi. Một trường hợp điều này thực sự hữu ích là cho bất kỳ ai phát triển với SCALA. Đặt SCALA_HOME cho cả scala dòng lệnh và GUI scala (chẳng hạn như trong netbeans) là một nỗi đau thực sự.
Warren P

0

Nếu bạn muốn thay đổi các biến môi trường vĩnh viễn trên macOS, hãy đặt chúng vào /etc/paths. Lưu ý , tập tin này là chỉ đọc theo mặc định, vì vậy bạn sẽ cần phải chmod cho phép ghi.


Điều này không làm việc cho tôi. Tôi có /usr/bin/localtrong tệp đó, ngay cả khi không sửa đổi tệp, theo cách đó theo mặc định, và các ứng dụng GUI của tôi chỉ nhìn thấy /usr/bin:/bin:/usr/sbin:/sbin. Tôi đã khởi động lại nhiều lần.
mgol

@m_gol Bạn nhận được gì khi chạy cat /etc/paths/?
IgorGanapolsky

1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, trong các dòng riêng biệt. Nhưng SourceTree nhìn thấy tất cả chúng ngoại trừ cái đầu tiên.
mgol

Bạn có thể muốn chỉnh sửa thành "Nếu bạn muốn thay đổi đường dẫn mặc định trong macOS". Điều này không liên quan gì đến vấn đề chung hơn về các biến môi trường.
rfay

0

Đối với người dùng Mac OS X Catalina 2020:

Hãy quên đi những câu trả lời vô dụng khác, ở đây chỉ cần hai bước:

  1. Tạo một tệp với quy ước đặt tên: ưu tiên tên ứng dụng. Sau đó sao chép-dán đường dẫn bạn muốn thêm vào PATH.

    Ví dụ 80-vscodevới nội dung /Applications/Visual Studio Code.app/Contents/Resources/app/bin/trong trường hợp của tôi.

  2. Di chuyển tập tin đó đến /etc/paths.d/. Đừng quên mở một tab mới (phiên mới) trong Terminal và gõ echo $PATHđể kiểm tra xem đường dẫn của bạn đã được thêm chưa!

Lưu ý: chỉ phương pháp này nối thêm đường dẫn của bạn vào PATH.

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.