2012-06-15 7 views
8

Có chức năng POSIX nào tìm kiếm PATH để thực thi theo POSIX spec's description of the PATH environment variable và trả về đường dẫn tuyệt đối cho tệp thực thi không?Chức năng POSIX để tìm kiếm PATH cho một tệp thực thi?

Nếu không, có cách đơn giản, an toàn, tiêu chuẩn và đáng tin cậy để tìm kiếm PATH không?

Edit: glibc's execvpe() function không PATH tìm kiếm riêng của mình, vì vậy tôi đoán đó không phải là một chức năng PATH tìm kiếm cụ thể được xác định bởi tiêu chuẩn.

Chỉnh sửa 2: Tôi không muốn để sao chép mã của người khác hoặc thực hiện các PATH tìm kiếm bản thân mình vì một vài lý do:

  • DRY
  • Nhiều mã tôi phải kiểm tra và duy trì
  • Các vấn đề cấp phép có thể xảy ra
  • POSIX nói, "Nếu PATH chưa được đặt hoặc được đặt thành không, tìm kiếm đường dẫn sẽ được xác định thực hiện". Tôi muốn hành vi trong những trường hợp này phù hợp với bất kỳ hệ thống nào, nhưng tôi không thể làm điều này nếu không có chức năng chuẩn mà tôi có thể gọi.
+1

'execvp' và' execlp' là các hàm chuẩn POSIX. Bạn đang tìm kiếm một hàm * chỉ * tìm kiếm '$ PATH'? –

+0

@larsmans: có, và trả về một chuỗi chứa đường dẫn đầy đủ đến tệp thực thi (nếu được tìm thấy) –

Trả lời

7

Có một chức năng POSIX để tìm kiếm PATH cho một thực thi theo mô tả của POSIX spec của các biến môi trường PATH và trả về đường dẫn tuyệt đối để thực thi?

số

Nếu không, là có một cách đơn giản, an toàn, tiêu chuẩn, và đáng tin cậy để tìm kiếm PATH?

Có và không. Có, có một tiêu chuẩn cho định dạng PATH, từ đó tính chính xác/độ tin cậy của việc triển khai thực hiện theo.

Không, không có hàm chuẩn nào thực hiện việc này. Sao chép mã là đặt cược tốt nhất của bạn.

Nếu PATH chưa được đặt hoặc được đặt thành không, tìm kiếm đường dẫn được xác định thực hiện.

Điều đó có nghĩa bạn có thể không phải lúc nào portably tái tạo những gì execvp không, nhưng tìm kiếm /bin:/usr/bin là một cược khá an toàn. Ngoài ra, chỉ cần tăng lỗi trong trường hợp này.

(Tôi thừa nhận rằng nó sẽ rất tuyệt nếu POSIX có chức năng này, nhưng nó không có ở đó.)

3

Công cụ dòng lệnh which sẽ làm điều đó. here's the man page

and the source

+0

Tôi không xem xét việc điều chỉnh hàng trăm dòng mã của người khác thành đơn giản. –

+1

Nếu có một cách đơn giản để làm điều đó, nó sẽ được thực hiện rồi. Nó không phải là một phần của thông số kỹ thuật posix. – gcochard

+1

Nó rất đơn giản. Lặp lại các yếu tố của '$ PATH' là một vài dòng C. Nếu bất cứ điều gì, lý do nó không có trong POSIX là nó * quá đơn giản *, nghĩa là tầm thường để tự làm nên không đáng ai phát minh ra giao diện mới. –

0

gì về làm một cái gì đó như:

FILE *f = popen("command -v somecommand", "r") 

và sau đó đọc kết quả của nó? Điều này sẽ dẫn đến hành vi phù hợp với xử lý của hệ thống trống/không được đặt PATH và có thể đơn giản hơn tìm kiếm thủ công PATH.

Có một số nhược điểm để tiếp cận này:

  • Nếu somecommand xuất phát từ người sử dụng, nó có thể phải được khử trùng để ngăn chặn các cuộc tấn công tiêm mã. Điều đó sẽ thêm vào sự phức tạp.
  • Đọc một cách đáng tin cậy luồng trong khi xử lý tất cả các trường hợp lỗi có thể là không nhỏ. Phức tạp hơn.
  • Nếu somecommand là vỏ được tích hợp sẵn (ví dụ: set), nó sẽ trả lại kết quả không có thật. Trường hợp này nên được phát hiện, nhưng sau đó những gì? Phức tạp hơn.