PATH trên hệ điều hành Mac là gì?


12

Là gì PATHtrong một Mac OS? Tôi đã sử dụng nó để cài đặt các công cụ dòng lệnh toàn cầu, nhưng tài liệu duy nhất tôi tìm thấy là các hướng dẫn để làm việc đó, không có lời giải thích thực sự về những gì đang xảy ra dưới mui xe. Tôi cũng không tìm thấy một trang có liên quan trên Wikipedia .

Vậy mục đích PATHvà sự khác biệt giữa /etc/paths~/.bash_profile** là gì?

Ví dụ, trong pathstệp của tôi , tôi thấy điều này:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Nhưng trong tôi ~/.bash_profile, tôi thấy điều này:

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

Đây có phải chỉ là một bổ sung dành riêng cho người dùng vào pathstập tin? Tất cả những thứ đó là gì paths, như thế /usr/binnào?


2
Vui lòng không kết hợp nhiều câu hỏi trong một bài. Mỗi câu hỏi của bạn sẽ được chào đón ở đây một cách riêng biệt nhưng không phải tất cả cùng nhau như thế này. Vui lòng cắt bớt câu hỏi này thành một câu hỏi duy nhất, bạn có thể kết hợp 1 và 2 nhưng những câu hỏi khác không liên quan gì đến PATH. 3 được trả lời ở đây 4 được giải thích ở đây và 5 không có nhiều ý nghĩa Tôi sợ. Cũng không có câu hỏi tiền thưởng của bạn, tập tin nào là nhị phân? Kịch bản không có.
terdon

Tôi đã chỉnh sửa câu hỏi của tôi xuống. Ngoài ra, tôi tìm thấy những liên kết hữu ích. Cảm ơn.
gwg

Câu trả lời:


15

1. Mục đích của PATH là gì?

PATHlà một biến môi trường chứa danh sách các thư mục được phân tách bằng dấu hai chấm trong đó shell của bạn sẽ tìm các tệp thực thi mà bạn đặt tên trên dòng lệnh mà không cung cấp đường dẫn rõ ràng cho chúng (như trong jsdocví dụ của bạn ). Vì vậy, nếu bạn PATH

/usr/bin:/bin:/home/bin

sau đó bất kỳ thực thi nào bạn gọi bằng tên sẽ được tìm kiếm trong các thư mục này (theo thứ tự đó) và thực thi đầu tiên được tìm thấy là một thực thi.

2. Sự khác biệt giữa / etc / path và ~ / .bash_profile

Theo câu hỏi này trên ServerFault , /etc/pathsđược sử dụng để đặt PATHtoàn cầu (nghĩa là toàn hệ thống, cho tất cả người dùng) trong khi ~/.bash_profileđược sử dụng để đặt tùy chọn cho mỗi người dùng (nơi ~sẽ là thư mục chính của người dùng). Những gì được viết trong .bash_profilecó thể thêm vào toàn cầu PATHtừ /etc/pathshoặc ghi đè lên nó hoàn toàn.

Đối với bản ghi, /etc/pathsdường như là một đặc thù của hệ điều hành MAC: ít nhất là tôi đã bắt gặp nó trên GNU / Linux.


Tôi chỉ chỉnh sửa chúng xuống, nhưng cảm ơn vì đã trả lời tất cả!
gwg

@ggundersen Tôi đã cắt bớt câu trả lời của mình để phù hợp với câu hỏi đã chỉnh sửa của bạn.
Joseph R.

@ggundersen bạn cũng có thể muốn đọc câu trả lời của tôi và các liên kết trong đó về /etc/pathsOSX.
terdon

7

Mục đích của PATH là gì?

Đó là cách vỏ của bạn tìm thấy các chương trình. Khi bạn gõ ls, ví dụ, đang chạy một chương trình gọi là lsmà sống ở /bintrên hầu hết các hệ thống, bao gồm cả Mac OS X. vỏ của bạn chỉ có thể thấy rằng vì /binlà trong PATH.

Shell tìm kiếm các chương trình theo PATHthứ tự, từ trái sang phải. Nếu có hai lschương trình trên hệ thống của bạn và các thư mục của chúng đều nằm trong bạn PATH, nó sẽ tìm thấy chương trình trong thư mục được liệt kê đầu tiên trong của bạn PATH.

Sự khác biệt giữa / etc / path và ~ / .bash_profile

Các đường dẫn được đặt trong /etc/pathsđược thêm vào PATHlúc khởi động trong tất cả các trình bao trên Mac OS X.

~/.bash_profilechỉ là một trong một số tập lệnh shell do Bash điều hành khi khởi động, và một vài trong số này là dành riêng cho Bash. Do đó, nếu bạn thay đổi vỏ của mình - Mac OS X cũng gửi tcshzsh, ví dụ - những thay đổi được thực hiện để /etc/bashrckhông áp dụng cho vỏ mới của bạn.

Ngoài ra, /etc/pathslà một tệp cấu hình cấp hệ thống, trong khi ~/.bash_profilelà cho mỗi người dùng. Nếu bạn có nhiều người dùng tương tác được thiết lập trên máy Mac của mình, bạn sẽ không muốn thêm các thư mục /etc/pathsmà bạn không muốn xuất hiện trong mọi người PATH. Điều tương tự cũng đúng /etc/bashrc, ngoại trừ điều đó tất nhiên chỉ áp dụng cho người dùng sử dụng Bash làm vỏ của họ.

Sự khác biệt giữa PATH và $ PATH và $ {PATH} là gì?

Bạn thường chỉ nhìn thấy biến mà không có sigil khi bạn đang đặt biến. FOO=barđặt FOObiến môi trường cho chuỗi bar. Nếu bạn gõ set, shell sẽ hiển thị cho bạn tất cả các biến môi trường và trong trường hợp đó bạn cũng thấy biến đó không có bất kỳ sigil nào.

$PATH${PATH}thường được hoán đổi cho nhau. Họ nói với shell để mở rộng PATHgiá trị của biến hiện tại tại chỗ. Sự khác biệt có liên quan đến cách thức và nơi bạn sử dụng chúng. Ví dụ:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

Trong echolệnh thứ hai , shell in không có gì vì nó yêu cầu shell in một biến được gọi là biến FOOxkhông tồn tại; shell xử lý các biến không tồn tại là rỗng. Bởi vì phần ba echosử dụng cú pháp dấu ngoặc nhọn, nó cho phép trình bao thấy rằng bạn đang yêu cầu FOObiến đó và đó xchỉ là một ký tự khác mà bạn muốn in ngay sau đó.

Nhân tiện, có một cách khác để có được hiệu ứng tương tự mà không cần niềng răng xoăn:

$ echo "$FOO"x
barx

Các biến môi trường được mở rộng trong dấu ngoặc kép và dấu ngoặc kép tách biệt xvới phần mở rộng biến để shell thực hiện đúng.

Tôi đang sử dụng FOObiến môi trường ở đây chỉ để rõ ràng. Tất cả mọi thứ tôi đã viết ở trên cũng áp dụng PATH, vì nó chỉ là một biến môi trường khác. Các văn bản ví dụ sẽ chỉ dài hơn rất nhiều.

Xuất khẩu PATH có nghĩa là gì? Khi nào chúng ta xuất khẩu?

Lấy FOOví dụ trên , nếu bạn chạy một chương trình khác, nó sẽ không thấy FOObiến vì nó không được xuất. Nó chỉ sống trong một thể hiện shell đó:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Khi tôi lần đầu tiên chạy bashshell mới bên dưới lớp vỏ mà tôi đã sử dụng, sau đó thử hiển thị giá trị của FOO, tôi nhận được một khoảng trống vì FOOkhông được xuất cho các chương trình con để xem. Sau đó, tôi đã thoát phiên bản thứ hai bash, xuất nó, chạy bashlại và bây giờ phiên bản thứ hai thấy giá trị của FOO.

Bạn sử dụng exportkhi bạn muốn các chương trình con thấy các giá trị được đặt trong trình bao và không sử dụng nó khi bạn không muốn điều đó xảy ra.

Thông thường, tôi không xuất các biến tạm thời trong các tập lệnh shell, vì tôi không muốn chúng thay đổi cách các chương trình chạy từ tập lệnh shell đó hoạt động.

Tôi sẽ không trả lời bất kỳ câu hỏi nào khác của bạn. Bạn chỉ nên hỏi một câu hỏi tại một thời điểm. Tôi chỉ trả lời câu hỏi này vì chúng liên quan một cách mơ hồ. Mọi thứ khác thuộc về một câu hỏi riêng biệt.

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.