Nó không nhất thiết phải tốt hơn.
Ưu điểm của #!/usr/bin/env python
nó là nó sẽ sử dụng bất cứ thứ gì có thể python
thực hiện được xuất hiện đầu tiên trong người dùng $PATH
.
Các nhược điểm của #!/usr/bin/env python
là nó sẽ sử dụng bất cứ python
thực thi xuất hiện đầu tiên trong sử dụng của $PATH
.
Điều đó có nghĩa là kịch bản có thể hành xử khác nhau tùy thuộc vào người điều hành nó. Đối với một người dùng, nó có thể sử dụng /usr/bin/python
cái đã được cài đặt với HĐH. Mặt khác, nó có thể sử dụng một thử nghiệm /home/phred/bin/python
không hoạt động chính xác.
Và nếu python
chỉ được cài đặt trong /usr/local/bin
, một người dùng không có /usr/local/bin
trong $PATH
thậm chí sẽ không có khả năng chạy các kịch bản. (Điều đó có thể không quá có khả năng trên các hệ thống hiện đại, nhưng nó có thể dễ dàng xảy ra đối với một trình thông dịch khó hiểu hơn.)
Bằng cách chỉ định #!/usr/bin/python
bạn chỉ định chính xác trình thông dịch nào sẽ được sử dụng để chạy tập lệnh trên một hệ thống cụ thể .
Một vấn đề tiềm năng khác là #!/usr/bin/env
mánh khóe không cho phép bạn truyền các đối số cho người thông báo (trừ tên của tập lệnh, được thông qua ngầm). Điều này thường không phải là một vấn đề, nhưng nó có thể. Nhiều tập lệnh Perl được viết cùng #!/usr/bin/perl -w
, nhưng use warnings;
là sự thay thế được đề xuất trong những ngày này. Tập lệnh Csh nên sử dụng #!/bin/csh -f
- nhưng tập lệnh csh không được khuyến nghị ở vị trí đầu tiên. Nhưng có thể có những ví dụ khác.
Tôi có một số tập lệnh Perl trong hệ thống kiểm soát nguồn cá nhân mà tôi cài đặt khi tôi thiết lập tài khoản trên hệ thống mới. Tôi sử dụng một tập lệnh cài đặt để sửa đổi #!
dòng của mỗi tập lệnh khi nó cài đặt nó trong tập lệnh của tôi $HOME/bin
. (Tôi đã không phải sử dụng bất cứ thứ gì khác ngoài #!/usr/bin/perl
thời gian gần đây; nó trở lại thời gian khi Perl thường không được cài đặt theo mặc định.)
Một điểm nhỏ: #!/usr/bin/env
lừa được cho là lạm dụng env
lệnh, vốn được dự định ban đầu (như tên ngụ ý) để gọi lệnh với môi trường bị thay đổi. Hơn nữa, một số hệ thống cũ hơn (bao gồm cả SunOS 4, nếu tôi nhớ lại chính xác) đã không có env
lệnh trong /usr/bin
. Cả hai điều này có khả năng là một mối quan tâm đáng kể. env
thực hiện theo cách này, rất nhiều tập lệnh sử dụng #!/usr/bin/env
mánh khóe và các nhà cung cấp hệ điều hành không có khả năng làm bất cứ điều gì để phá vỡ nó. Nó có thể là một vấn đề nếu bạn muốn tập lệnh của mình chạy trên một hệ thống thực sự cũ, nhưng sau đó bạn có thể cần phải sửa đổi nó.
Một vấn đề khác có thể xảy ra, (cảm ơn Sopalajo de Arrierez vì đã chỉ ra nó trong các bình luận) là các công việc định kỳ chạy với một môi trường hạn chế. Đặc biệt, $PATH
thường là một cái gì đó như /usr/bin:/bin
. Vì vậy, nếu thư mục chứa trình thông dịch không nằm trong một trong những thư mục đó, ngay cả khi nó nằm trong mặc định của bạn $PATH
trong vỏ người dùng, thì /usr/bin/env
thủ thuật sẽ không hoạt động. Bạn có thể chỉ định đường dẫn chính xác hoặc bạn có thể thêm một dòng vào crontab của mình để đặt $PATH
( man 5 crontab
để biết chi tiết).