Làm thế nào để Unix tìm kiếm các tập tin thực thi?


47

Khi một tập tin được thực thi, Unix tìm kiếm nó như thế nào? Nếu có nhiều tệp thực thi trong PATH có cùng tên, tệp nào được ưu tiên? Là thư mục hiện tại có trong tìm kiếm khi một tập tin được thực thi?

Giả sử có một tệp có tên executable.shtrong thư mục hiện tại. Nó sẽ hoạt động nếu nó được thực thi $ executed.không phải là một phần của PATH?


đề cập đến which <executable>lệnh sẽ hữu ích trong chủ đề này.
Kế toán م

Câu trả lời:


45

$ PATH được tìm kiếm từ đầu đến cuối, với lệnh thực thi phù hợp đầu tiên được chạy. Vì vậy, các thư mục ở đầu $ PATH được ưu tiên hơn các thư mục đến sau. Các tệp thực thi trong thư mục hiện tại (.) Chỉ được thực thi nếu. là trong $ PATH ( thường là không ). Không có sự bao gồm ngầm định của thư mục hiện tại trong đường dẫn tìm kiếm.


Thật kỳ lạ khi $ PATH của tôi không chứa ., nhưng dường như nó sẽ tìm kiếm từ thư mục hiện tại trước, trước khi kiểm tra các thư mục được xác định trong chính $ PATH.
Eric Wang

19

Đối với các tệp trong thư mục hiện tại, bạn sẽ muốn đặt trước chúng ./, vì vậy lệnh sẽ trở thành ./executable.sh. Bạn không bao giờ nên có .trong PATH của mình vì nó gây ra rủi ro bảo mật, trong số các vấn đề khác.

Các thư mục đến đầu tiên trong PATH và tìm kiếm đầu tiên.

Thứ tự tổng thể để tìm kiếm là như thế này nếu tôi nhớ chính xác:

  • bí danh

  • chức năng xuất khẩu

  • lệnh shell tích hợp

  • tập lệnh và mã nhị phân trong PATH của bạn


7
Tôi đã thêm hàm băm - hãy nhớ bash (và có thể các shell khác) giữ một hàm băm của các lệnh được sử dụng gần đây để làm cho việc tìm kiếm chúng dễ dàng hơn. Đôi khi bạn phải xóa bộ nhớ cache (bằng cách sử dụng hash -r) nếu bạn thay đổi vị trí PATH hoặc chương trình.
Rich Homolka

3
+1 cho thứ tự tìm kiếm. Sẽ thật tuyệt nếu bạn có thể nhớ nguồn thông tin :)
twan163

8

Mặc dù điều này đã được một số người khác trả lời tốt, tôi muốn thêm một vài suy nghĩ:

1) PATH chỉ được tham khảo nếu lệnh được thực thi không có phần tử đường dẫn trong đó. somecommand sẽ được tra cứu trong $ PATH, ./somecommandhoặc /usr/bin/somecommand, hoặc ../../bin/somecommandchỉ sử dụng các quy tắc thư mục, không phải PATH

Nếu có nhiều tệp thực thi trong PATH có cùng tên thì tệp nào được ưu tiên?

Nó dừng lại ở cái đầu tiên nó tìm thấy, đọc $ PATH từ trái sang phải.

Là thư mục hiện tại có trong tìm kiếm khi tập tin được thực thi?

Nếu thư mục hiện tại nằm trong PATH thì nó được tìm kiếm. Hãy nhớ rằng một thư mục trống trong PATH bao gồm thư mục hiện tại. ví dụ: PATH =: / usr / bin (trống rỗng)

Giả sử có một tệp có tên execable.sh trong một thư mục hiện tại. Nó sẽ hoạt động nếu nó được thực thi $ exec và. không phải là một phần của PATH?

Nó sẽ không bao giờ tìm thấy nó bằng cách tìm kiếm PATH. Nếu thư mục hiện tại không có trong PATH, nó sẽ không tìm thấy nó bằng cách tra cứu PATH.

Điều đó nói (và xin lỗi để thêm nhầm lẫn) nếu có một bí danh hoặc chức năng chạy lệnh, nó sẽ được chạy. Hoặc nếu shell của bạn có bộ đệm vị trí và tệp thực thi nằm trong bộ đệm, nó có thể tìm thấy nó. Vì vậy, nó sẽ không bao giờ tìm thấy nó trong PATH, nhưng nó có thể được điều hành bằng các phương tiện khác.


Cảm ơn bạn đã cachelưu ý, nó gần như khiến tôi phát điên khi thực thi cũ /usr/bin/vẫn được gọi không phải là cái mới /usr/local/bin, tuy nhiên nó ở bên trái $PATHcho đến khi tôi đăng xuất và đăng nhập lại.
Kế toán م

1
@theaccountant trong bash bạn có thể thực hiện 'hash -r' để xóa bộ đệm shell
Rich Homolka

4

Để xem những gì con đường của bạn hiện chỉ là loại echo $PATH, hoặc printenv PATH.

Sau đó, bạn sẽ biết thứ tự tìm kiếm. Nếu bạn có nhiều tệp có cùng tên, chỉ cần chạy ____ để xem.

Vd

hệ thống #> mà grep

/ usr / bin / grep

một cách thú vị để tìm các tệp hoạt động như mục tiêu của bạn là sử dụng apropos:

apropos grep

bzgrep (1) - tìm kiếm các tệp nén bzip2 có thể cho biểu thức chính quy

egrep (1) - các dòng in phù hợp với một mẫu

fgrep (1) - các dòng in phù hợp với một mẫu

grep (1) - các dòng in phù hợp với một mẫu

và v.v.


2
Ồ vâng - Tôi đã quên chức năng whereis để tìm TẤT CẢ các phiên bản của tệp:> whereis grep
mbb

grep: / bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereissử dụng một danh sách mã hóa các vị trí, không $PATH.
grawity

@grawity Bạn có thể mở rộng về điều đó?
WinEunuuchs2Unix

-2

@ coneslayer- Thứ tự mặc định của việc tìm kiếm thực thi là đường dẫn hiện tại, được xây dựng trong các lệnh và sau đó là $ PATH. Vì vậy, nếu một hàm có tên là thực thi đã tồn tại trong pwd, thì nó sẽ được thực thi. Nếu không thì ưu tiên tìm kiếm các lệnh được xây dựng trong shell và sau đó là $ PATH


Nếu bạn đang nói về vỏ Thompson, vỏ Mashey hoặc một số sự nắm giữ hóa thạch khác từ 40 năm trước, bạn có thể đúng. Nhưng không có shell Unix chính hiện tại tự động tìm kiếm thư mục hiện tại.
Scott

@Scott Vì vậy, đường dẫn tìm kiếm mặc định cho lệnh được tích hợp trước tiên và sau đó là $ PATH và chỉ tìm kiếm CWD nếu tôi đưa ra ./? Tôi có đúng không
Proc

Vâng, bí danh, chức năng và nội dung. Sau đó, nếu bạn chỉ định một đường dẫn bằng lệnh (bao gồm ./), nó chỉ tìm kiếm thư mục đó; nếu không, nó tìm kiếm $PATH.
Scott
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.