it-swarm-vi.com

Làm thế nào để / usr / bin / env biết nên sử dụng chương trình nào?

Khi tôi sử dụng Shebang #!/usr/bin/env python để chạy tập lệnh, làm thế nào để hệ thống biết python sẽ sử dụng? nếu tôi tìm đường dẫn python bin trong các biến môi trường thì tôi không tìm thấy gì.

env | grep -i python
65
tMC

Shebang mong muốn một đường dẫn đầy đủ đến trình thông dịch sẽ sử dụng nên cú pháp sau sẽ không chính xác:

#!python

Đặt đường dẫn đầy đủ như thế này có thể hoạt động:

#!/usr/local/bin/python

nhưng sẽ không khả dụng khi python có thể được cài đặt trong /bin, /opt/python/bin, hoặc bất cứ nơi nào khác vị trí.

Sử dụng env

#!/usr/bin/env python

là một phương thức cho phép một cách di động để chỉ định cho HĐH một đường dẫn đầy đủ tương đương với đường dẫn trong đó python được đặt đầu tiên trong PATH.

55
jlliagre

Dòng Shebang (từ bang sharp sharp bang, tức là #!) được xử lý bởi kernel. Hạt nhân không muốn biết về các biến môi trường, chẳng hạn như PATH. Vì vậy, tên trên dòng Shebang phải là một đường dẫn tuyệt đối đến một tệp thực thi. Bạn cũng có thể chỉ định một đối số bổ sung để chuyển sang thực thi đó trước tên tập lệnh (với các hạn chế phụ thuộc hệ thống mà tôi sẽ không đi vào đây). Ví dụ: đối với tập lệnh Python, bạn có thể chỉ định

#!/usr/bin/python

trên dòng đầu tiên và khi bạn thực thi tập lệnh, nhân trên thực tế sẽ thực thi /usr/bin/python /path/to/script. Nhưng điều đó không thuận tiện: bạn cần chỉ định đường dẫn đầy đủ của lệnh. Nếu bạn có python in /usr/bin trên một số máy và /usr/local/bin cho người khác? Hoặc bạn muốn đặt PATH thành /home/joe/opt/python-2.5/bin để sử dụng một phiên bản cụ thể của Python? Vì kernel sẽ không thực hiện tìm kiếm PATH cho bạn, nên ý tưởng là làm cho kernel chạy một lệnh mà lần lượt tìm kiếm trình thông dịch mong muốn trong PATH:

#!/fixed/path/to/path-lookup-command python

Cái đó path-lookup-command phải lấy tên của một tệp thực thi làm đối số và tra cứu nó trong PATH và thực thi nó: kernel sẽ chạy /fixed/path/to/path-lookup-command python /path/to/script. Khi nó xảy ra, lệnh env thực hiện điều đó. Mục đích chính của nó là chạy một lệnh với một môi trường khác, nhưng vì nó tìm kiếm tên lệnh trong $PATH, nó hoàn hảo cho mục đích của chúng tôi ở đây.

Mặc dù điều này không được bảo đảm chính thức, các hệ thống Unix lịch sử đã cung cấp env in /usr/bin và các hệ thống hiện đại đã giữ chính xác vị trí đó vì việc sử dụng rộng rãi #!/usr/bin/env. Vì vậy, trong thực tế, cách để xác định rằng tập lệnh phải được thực thi bởi trình yêu thích của người dùng Python là

#!/usr/bin/env python

Phải, nên chạy:

env | grep PATH

$ PATH của bạn là một danh sách các thư mục. Unix sẽ đi qua danh sách các thư mục đó, theo thứ tự cho đến khi tìm thấy "python".

Bạn có thể xem thư mục nào nó tìm thấy bằng lệnh 'which':

which python
7
Dan Rue