Tôi đang làm việc trên một ứng dụng C phải đi $ PATH để tìm tên đầy đủ cho các tệp nhị phân và phụ thuộc duy nhất được phép là glibc (tức là không có chương trình bên ngoài gọi nào như thế). Trong trường hợp bình thường, điều này đòi hỏi phải chia tách getenv ("PATH") bằng dấu hai chấm và kiểm tra từng thư mục một, nhưng tôi muốn chắc chắn rằng tôi bao gồm tất cả các trường hợp góc có thể. Tôi nên tìm kiếm những thứ gì? Đặc biệt, là các đường dẫn tương đối, các đường dẫn bắt đầu bằng ~ có nghĩa là được mở rộng thành $ HOME, hoặc các đường dẫn có chứa: char được cho phép?
Trả lời
Một điều khiến tôi ngạc nhiên một lần là chuỗi rỗng trong PATH
có nghĩa là thư mục hiện tại. Hai dấu hai chấm liền kề hoặc dấu hai chấm ở cuối hoặc đầu của PATH
nghĩa là thư mục hiện tại được bao gồm. Điều này được ghi lại trong ví dụ man bash.
Nó cũng nằm trong số POSIX specification.
Vì vậy
PATH=:/bin
PATH=/bin:
PATH=/bin::/usr/bin
Tất cả có nghĩa là thư mục hiện hành là ở PATH
Tôi không chắc chắn đây là một vấn đề với Linux nói chung, nhưng chắc chắn rằng mã của bạn hoạt động nếu PATH
có một số sôi nổi (như, UTF-8) mã hóa để đối phó với các thư mục với các chữ cái lạ mắt. Tôi nghi ngờ điều này có thể phụ thuộc vào mã hóa hệ thống tập tin.
Tôi nhớ làm việc trên một báo cáo lỗi của một số anh chàng người Nga có chữ cái lạ mắt trong tên người dùng của mình (và do đó, tên thư mục chính của anh xuất hiện trong PATH
).
Không, mã hóa không liên quan đến 'PATH'. Nếu một chương trình xem xét nó, nó là lỗi. –
@R .: Thú vị; bạn có một số thông số kỹ thuật để hỗ trợ yêu cầu đó không? Sự hiểu biết của tôi là để phân tích cú pháp 'PATH', bạn cần xử lý nó như là một chuỗi các ký tự (thay vì một chuỗi các' byte'), do đó bạn cần phải biết mã hóa. –
Ký tự duy nhất đặc biệt trong 'PATH' là': ', do đó, lần duy nhất yêu cầu của bạn có thể có hiệu lực là mã hóa CJK theo định hướng Windows, nhưng chúng thường được coi là không sử dụng được trên Unix. –
Điều này rất nhỏ nhưng tôi sẽ thêm nó vì nó chưa được đề cập. $ PATH có thể bao gồm cả đường dẫn tuyệt đối và tương đối. Nếu bạn thu thập danh sách đường dẫn bằng chdir (2) ing vào mỗi thư mục, bạn cần phải theo dõi thư mục làm việc ban đầu (getcwd (3)) và chdir (2) trở lại với nó tại mỗi lần lặp lại thu thập thông tin.
Những câu trả lời hiện có bao gồm hầu hết của nó, nhưng nó có giá trị bao gồm các bộ phận của câu hỏi mà không được trả lời nào:
- $ và ~ không phải là đặc biệt trong giá trị của $ PATH.
- Nếu $ PATH không được đặt ở tất cả,
execvp()
sẽ sử dụng giá trị mặc định.
+1 Sau khi kiểm tra mã nguồn cho 'which', có vẻ như đây là trường hợp góc duy nhất. 'which' trước tiên sẽ kiểm tra xem đường dẫn đầy đủ đã được cung cấp chưa và tệp có thể thực thi hay không. Sau đó nó sẽ thêm vào trước mỗi thành phần của đường dẫn và kiểm tra lại, thay thế thành phần đường dẫn trống bằng thư mục hiện tại. –
Theo thông số kỹ thuật, việc thực hiện 'which' và một số shell tiêu chuẩn phổ biến sẽ mang lại một góc nhìn khá tốt. – Novelocrat