Toàn cảnh nơi đặt biến PATH được đặt trong bash


16

Tôi đã đọc ở một vài nơi mà tập tin PATHđược đặt /etc/profilehoặc .profiletập tin trong thư mục nhà.

Đây có phải là những nơi duy nhất mà đường dẫn được đặt không? Tôi muốn hiểu rõ hơn về nó.

Trong các /etc/profiletập tin, như nhận xét sau đây nói "system-wide .profile file for the Bourne shell". Điều đó có nghĩa là các tệp hồ sơ là các tệp cấu hình chính cho bash?

Trong tập tin đó tôi không thấy PATHvar nào được đặt cả. Trong .profiletập tin trong thư mục chính có dòng này:

PATH="$HOME/bin:$PATH"

Điều đó được đặt lại PATHbởi vẻ ngoài bởi vì nó nối $PATHchuỗi đã được đặt với $HOME/bin:phải không? Nhưng nếu etc/profile~/.profilelà các tập tin chỉ thiết lập PATHnơi đang $PATHđến từ trong đó dòng mã nếu nó không quy định tại /etc/profile?

Ai đó có thể có kinh nghiệm xin vui lòng cho một lời giải thích rộng rãi và chi tiết về các PATHbiến? Cảm ơn!

Câu trả lời:


19

Có nhiều nơi PATHcó thể được thiết lập.

Các loginchương trình đặt nó vào một giá trị mặc định. Cách cấu hình giá trị mặc định này phụ thuộc vào hệ thống. Trên hầu hết các hệ thống Linux không nhúng, nó được lấy từ /etc/login.defs, với các giá trị khác nhau cho root và cho người dùng khác. Tham khảo login(1)hướng dẫn trên hệ thống của bạn để tìm hiểu những gì nó làm.

Trên các hệ thống sử dụng PAM , cụ thể là pam_envmô-đun, các biến môi trường có thể được đặt trong tệp toàn hệ thống /etc/environmentvà tệp trên mỗi người dùng ~/.pam_environment.

Sau đó, hầu hết các cách để đăng nhập (nhưng không phải công việc định kỳ) thực thi trình vỏ đăng nhập để đọc các tệp cấu hình trên toàn hệ thống và theo người dùng. Các tệp này có thể sửa đổi giá trị của PATH, thường để thêm các mục nhưng đôi khi theo các cách khác. Những tập tin nào được đọc phụ thuộc vào shell đăng nhập là gì. Vỏ kiểu Bourne / POSIX đọc /etc/profile~/.profile. Bash đọc /etc/profile, nhưng đối với tệp trên mỗi người dùng, nó chỉ đọc tệp hiện có đầu tiên trong số ~/.bash_profile, ~/.bash_login~/.profile. Zsh đọc /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogin~/.zlogin. Nhiều phiên GUI sắp xếp để tải /etc/profile~/.profile, nhưng điều này phụ thuộc vào trình quản lý hiển thị, trên môi trường máy tính để bàn hoặc tập lệnh khởi động phiên khác và cách mỗi phân phối đã thiết lập các phân phối này.


4

Biến PATH ban đầu thường được đặt trong /etc/profile Đôi khi, quản trị viên hệ thống cũng sẽ đặt biến PATH vào nguồn trong/etc/profile.d

Đây là các vars PATH hệ thống mà tất cả những người đăng nhập kế thừa theo mặc định (trừ khi quá nhiều địa phương). Điều này thường đặt các đường dẫn rõ ràng, như /usr/bin, mặc dù trong công việc của tôi, chúng tôi sử dụng /optvà một vài vị trí tùy chỉnh rộng rãi, vì vậy chúng cũng được đặt ở đó.

Trên tài khoản cơ sở đăng nhập theo người dùng, PATH cũng có thể được xác định trong ~/.profile. Điều đó có thể xác định những điều mà không phải tất cả người dùng đều có quyền truy cập; có thể người đứng đầu bộ phận có thể chạy nhị phân từ /optnhưng những người dùng khác không bận tâm với những nhị phân đó. Người dùng cũng có thể tự sửa đổi tệp đó và điều tuyệt vời .profilelà nó không phải là vỏ cụ thể; nếu bạn đăng nhập, bộ PATH ở đó sẽ có nguồn gốc.

Đối với thông tin đăng nhập vỏ cụ thể, PATH thể được định nghĩa trong ~/.bash_profile, ~/.bashrchoặc .cshrc, hoặc tương đương. Người dùng có thể đặt PATH tại đây nếu họ muốn các đường dẫn cụ thể cho các shell cụ thể hoặc nếu chúng chỉ xảy ra để duy trì tất cả các sở thích cá nhân của họ ở đó.

Tóm lại: / etc / profile và /etc/profile.d là các cài đặt xếp tầng theo truyền thống; chúng được kế thừa và thường được thêm vào trong các tệp chấm cá nhân (mặc dù người dùng có thể chọn ghi đè chúng thay thế). Các tệp chấm cá nhân thường được đặt bởi người dùng.

Tất nhiên, shell cũng có các biến môi trường, do đó, biến môi trường cục bộ cũng có thể thêm hoặc ghi đè PATH mặc định trong bất kỳ tệp cấu hình nào.


Tuy nhiên, tôi vừa kiểm tra tất cả các tệp mà bạn đã đề cập, ~ / .bash_profile và .cshrc không tồn tại. 3 tệp script trong /etc/profile.d dir: appmenu-qt5.sh, bash_completion.sh & vte.sh cũng không đặt biến PATH. Ý bạn là gì với "shell cũng có biến môi trường" là PATH mặc định được đặt trong chương trình nhị phân / bin / bash? Khi tôi kết thúc echo $ PATH tôi nhận được: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games nhưng tôi không có ý tưởng rằng tất cả đang được thiết lập thực sự.
Larry Lawless

Tôi nghĩ rằng tôi đã đọc sai câu hỏi của bạn, tôi nghĩ rằng bạn đang yêu cầu tất cả các vị trí PATH có thể được đặt, nhưng tôi nghĩ rằng bạn quan tâm nhiều hơn đến nơi PATH ban đầu được đặt. Đối với điều đó, nhìn vào /etc/bashrc. Điều này xác định cách BASH được khởi chạy, bao gồm tất cả các biến môi trường ban đầu. Trên hệ thống của tôi, /etc/bashrcđọc từ /etc/profile.dnhưng có vẻ như bạn chỉ có 3 tệp /etc/profile.dđể bản phân phối của bạn có thể làm khác đi.
Klaatu von Schlacker

1
Về cơ bản tôi muốn biết những thứ bên trong của nó. Tôi ước Ken Thompson là cha của tôi :)
Larry Lawless

Bạn sẽ đến đó. Hãy tin tôi, sau khi bạn sử dụng công cụ này hàng ngày trong một thời gian, tất cả bắt đầu chìm vào, và miễn là bạn tiếp tục hỏi "tại sao?" và đọc tài liệu cho câu trả lời, cuối cùng bạn cũng học được rất nhiều!
Klaatu von Schlacker

Trong Linux Mint 18 Cinnamon hãy chắc chắn kiểm tra /etc/profile.d/jdk_home.sh Tôi đã đổi tên tệp này thành jdk_home.sh.old và bây giờ đường dẫn của tôi không bị ghi đè và tôi có thể gọi java -version và xem Java 9 như hy vọng. Mặc dù tôi đã chọn một cách chính xác Java 9 trong update-aternatives --config java tập tin jdk_home.sh này giữ trọng $ PATH
flyingdrifter

3

Để thêm vào các câu trả lời khác:

bashsẽ được đặt thành PATHgiá trị mặc định được mã hóa cứng nếu nó không được đặt trong môi trường. Trên máy Ubuntu Server 16.04.2, tôi nhận được:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Chúng tôi có thể kiểm tra xem giá trị này có thực sự được mã hóa cứng và không được đọc từ môi trường hoặc một số tệp bằng cách sử dụng stringstiện ích:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Tuy nhiên, tôi nhận được một kết quả khác trên máy Arch Linux của mình:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

Vì vậy, có vẻ như mặc định này được chọn tại thời điểm bashnhị phân được xây dựng, điều này phụ thuộc vào hệ điều hành / phân phối đang sử dụng.


0

Những thứ mà tôi không thấy:

  • X thứ
  • Masterfiles từ đâu .profileđược sao chép khi tạo tài khoản
  • pam_env
  • Một chủ đề gần đây trên Debian , nơi điều này được thảo luận chi tiết.

Đối với Ken Thompson, bạn có thể ngạc nhiên về "Quan điểm về Linux" của anh ấy .

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.