Làm thế nào để Mac OS X thiết lập giá trị của $ PATH?


11

Tôi có một sự hiểu biết cơ bản về cách $ PATH có thể được đặt, nhưng có tài liệu nào mô tả đầy đủ nơi Mac OS có được tất cả các đường dẫn được gắn vào $ PATH không? Tôi biết những điều như /etc/profile, /etc/paths/etc/profile.d, nhưng có những kịch bản khác cuối cùng ảnh hưởng đến giá trị của $ PATH không? Tôi cũng không quen lắm giữa các shell không đăng nhập và đăng nhập ( .bashrc, .bash_profile), nhưng tôi nhận thức được sự khác biệt cơ bản.

Câu trả lời:


9

Thông thường, PATH của bạn được đặt bởi vỏ. Đối với Bash, mọi thứ được giải thích trong hướng dẫn . Bạn cũng có thể mở man bashvà bỏ qua INVOCATIONphần.

Được gọi dưới dạng vỏ đăng nhập tương tác hoặc với --login

Khi Bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với tùy chọn --login, trước tiên, nó sẽ đọc và thực thi các lệnh từ tệp / etc / profile, nếu tệp đó tồn tại. Sau khi đọc tệp đó, nó sẽ tìm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, đọc và thực thi các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được.

Được gọi là một vỏ không đăng nhập tương tác

Khi một vỏ tương tác không phải là vỏ đăng nhập được khởi động, Bash đọc và thực thi các lệnh từ ~ / .bashrc, nếu tệp đó tồn tại. Ngoài ra, trong OS X, có path_helperđọc nội dung /etc/paths.dvà nối thêm chúng vào đường dẫn của bạn.

Chìa khóa ở đây là trên OS X, Terminal mở shell đăng nhập theo mặc định, trong khi trên Linux, shell thường được bắt đầu dưới dạng shell không đăng nhập. Josh Staiger có một lời giải thích tốt về vỏ đăng nhập và vỏ không đăng nhập .

Vì vậy, về cơ bản chỉ có hai ba nơi bạn có thể đặt đường dẫn:

  • /etc/profile(mà gọi path_helper)
  • /etc/paths/etc/paths.d(được gọi từ path_helper)
  • tập tin cấu hình shell của bạn ( .bash_profile)

Cảm ơn cho câu trả lời súc tích, và thông tin. Vì vậy, tôi đoán tôi đã hiểu, kịch bản / tạo tác nào ảnh hưởng đến $ PATH rồi. Vì vậy, điều này có nghĩa /etc/profilelà một kịch bản chủ yếu được sử dụng bởi bash? Tôi không có kinh nghiệm với các loại vỏ khác, nhưng tôi cho rằng chúng theo một cấu trúc khác?
Cú đấm tâm lý

/etc/profileđược sử dụng bởi hầu hết (tất cả? Không chắc chắn 100%). Đó là lý do tại sao đó là một lựa chọn tốt để đặt mọi thứ mà bạn muốn ở mọi nơi, như PATHs. Bash đọc .bash_các tệp trong khi Zsh chẳng hạn đọc .zshrcngoài các tệp khác. Nó phụ thuộc vào vỏ.
slhck

"Trong OS X, ngoài ra, còn có path_helper đọc nội dung của /etc/paths.d và nối thêm chúng vào đường dẫn của bạn." Không, path_helperkhông kêu gọi vỏ không đăng nhập tương tác (hay vỏ không tương tác). Nó được gọi là shell đăng nhập tương tác, /etc/profilethực sự.
Maggyero

8

Các đường dẫn trong /etc/paths/etc/paths.d/*thường được thêm vào PATHbởi path_helper . path_helperđược chạy từ /etc/profile, vì vậy nó được chạy khi bash được gọi dưới dạng shell đăng nhập tương tác, nhưng không phải khi bash được gọi dưới dạng shell không đăng nhập hoặc shell không tương tác.

/etc/pathschứa /usr/local/binở cuối theo mặc định và /etc/paths.d/trống theo mặc định.

Terminal và iTerm 2 mở shell mới dưới dạng shell đăng nhập theo mặc định và shell được mở khi bạn ssh vào máy tính của bạn cũng là shell đăng nhập. Nhiều trình giả lập thiết bị đầu cuối trên các nền tảng khác tmuxvà chế độ shell trong Emacs mở shell mới dưới dạng shell không đăng nhập.

Tôi đã 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

Nó thay đổi giá trị của PATHquá trình launchd gốc. Giá trị được kế thừa bởi tất cả các quy trình khác, bao gồm các quy trình khởi động cho mỗi người dùng. 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à khởi chạy lại các quy trình.

Trên OS X, ~/.profilekhông được đọc khi bạn đăng nhập bằng đồ họa. Nếu cả hai ~/.bash_profile~/.profiletồn tại, bash cũng không đọc ~/.profile.

~/.MacOSX/environment.plist ngừng hoạt động vào 10.8.

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.