Có đảm bảo rằng / usr / bin / env sẽ tồn tại không?


8

Thường thì tôi sẽ thấy các tập lệnh bắt đầu bằng một dòng shebang sử dụng #!/usr/bin/env interpreter_namecho bất kỳ trình thông dịch nào, với lý do là các hệ thống khác nhau có thể có trình thông dịch mà chúng cần để chạy được cài đặt ở những nơi khác nhau. Chẳng hạn, nếu tôi giả sử pythonđược cài đặt /usr/bin/pythonthì một số người dùng đã quyết định cài đặt nó vì /opt/pythonmột số lý do sẽ không thể sử dụng nó một cách dễ dàng.

Nhưng câu hỏi rõ ràng là, có bất kỳ đảm bảo nào envsẽ được cài đặt tại /usr/bin/env(hoặc cho vấn đề đó ở bất kỳ địa điểm cụ thể nào không), hay đây chỉ là một trường hợp "di chuyển vấn đề" để nói?

Câu hỏi hơi liên quan này có một nhận xét nói rằng đó là một ý tưởng tồi và tốt nhất là cài đặt nó với đường dẫn thực tế của trình thông dịch và trích dẫn đặc tả unix duy nhất nhưng không thực sự giải quyết câu hỏi này.

Câu trả lời:


6

Không, envkhông được đảm bảo để tham gia /usr/bin, như bạn có thể đọc trong lịch sử của cơ chế shebang , trong phần "Tiện ích env":

Tuy nhiên, vị trí của env (1) có thể khác nhau. Free-, Net-, OpenBSD và một số bản phân phối Linux (ví dụ Debian) chỉ đi kèm với / usr / bin / env. Mặt khác, chỉ có / bin / env ít nhất trên SCO OpenServer 5.0.6 và Cray Unicos 9.0.2 (mặc dù sau này chỉ là lợi ích lịch sử). Trên một số bản phân phối Linux khác (Redhat), nó nằm trong / bin và / usr / bin / chứa một liên kết tượng trưng chỉ vào nó.

Nó không di chuyển vấn đề hoàn toàn, vì tính linh hoạt của envtìm kiếm $PATH. Nếu bạn tình cờ nhận được một số kịch bản có sử dụng một vị trí khác nhau cho envtừ của bạn, bạn chỉ cần phải biết về nơi bạn envsống, và không còn nơi perl, pythonvà thông dịch khác có thể được cài đặt.

Và bạn không cần phải cứng mã /opt/python/3.3.2/bin/python3.3nếu đó là lần python3.3thực thi đầu tiên trong PATH của bạn. Bạn chỉ có thể dựa vào envviệc tìm kiếm nó, vì vậy bạn không phải cập nhật từng tập lệnh nếu bạn nâng cấp lên /opt/python/3.3.3/bin/python3.3. Tiêu đề tập lệnh của bạn giữ nguyên:

#! /usr/bin/env python3.3

Aha. Cảm ơn bạn. Tôi không thể tìm thấy bất kỳ thông tin về điều đó. Khi tôi nói "di chuyển" vấn đề, ý tôi là thay vì tìm kiếm python perl, v.v., bây giờ bạn chỉ cần săn lùng env, vì vậy cùng một vấn đề, nhưng một mục tiêu khác. Dường như nó envdễ tìm hơn nhiều, và rõ ràng là linh hoạt hơn nhiều, vì vậy nó vẫn rất thuận lợi. Mà trả lời câu hỏi của tôi hoàn hảo. Cảm ơn bạn!
scott_fakename
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.