2009-02-20 25 views
17

Tôi muốn chạy perl -w sử dụng env. Đó là hoạt động tốt trên dòng lệnh:Tôi có thể sử dụng công tắc của perl với/bin/env trong dòng shebang không?

$ /bin/env perl -we 'print "Hello, world!\n"' 
Hello, world! 

Nhưng nó không hoạt động trên dòng công việc trong một kịch bản:

#!/bin/env perl -w 
print "Hello, world!\n"; 

Dưới đây là lỗi:

/bin/env: perl -w: No such file or directory 

Rõ ràng env không hiểu được -w cờ mà tôi đang đi qua để perl. Chuyện gì vậy?

+0

Đồng thời xem cách làm điều đó với một chút hackery vỏ [một] (http://stackoverflow.com/a/9051635/128583) và [hai] (http://stackoverflow.com/a/3306658/128583). – Davorak

Trả lời

25

Các hash-bang không phải là một tiện ích dòng lệnh bình thường, phân tích và trắng-không gian xử lý là khác nhau - đó là những gì bạn đã đạt. Xem:

Về cơ bản nhiều/nhất unixes đặt tất cả các văn bản còn lại sau khi không gian đầu tiên vào một đối số duy nhất.

Vì vậy:

#!/bin/env perl -w 

là tương đương với:

/bin/env "perl -w" 

vì vậy bạn cần phải xử lý bất kỳ tùy chọn để người phiên dịch perl trong một số thời trang khác. ví dụ:

use warnings; 

(như @Telemachus)

15

Thay vì -w sử dụng những lời cảnh báo pragma (đối với phiên bản hiện đại của Perl):

#!/bin/env perl 
use warnings; 
use strict; 
+0

Yeah, tôi biết về "cảnh báo sử dụng", nhưng tôi đang sử dụng để chỉ cần viết "perl -w" và tôi đang bối rối rằng "env" sẽ làm việc trên dòng lệnh, nhưng không phải trong kịch bản. – Frank

+0

"perl -w" hoạt động trên Unix, và ngắn gọn hơn, nhưng nó không hoạt động trên Windows (trừ khi ActivePerl hoặc những gì bạn rõ ràng tìm kiếm cờ dòng lệnh trong một dòng shebang), vì vậy tốt hơn là chỉ "sử dụng cảnh báo; ". –

-1

Bạn đang quên thư mục /usr.

+1

env có thể ở các vị trí khác nhau. Trên hệ thống của tôi, nó nằm trong/bin/env với một liên kết mềm đến/usr/bin/env. Kể từ khi nó hoạt động hình thành dòng lệnh, tôi giả sử anh ta có con đường chính xác của chương trình. – gpojd

+1

Sẽ dễ sử dụng hơn/usr/bin/env. –

5

tôi nghĩ rằng nó có thể có ích để đưa lên rằng "-w" không giống như "sử dụng cảnh báo". -w sẽ áp dụng cho tất cả các gói mà bạn sử dụng, "sử dụng cảnh báo" sẽ chỉ áp dụng từ vựng. Bạn thường không muốn sử dụng hoặc dựa vào "-w"

2

Nó đáng chú ý là Mac OS X giải thích nhân vật sau khi công việc như các đối số, vì vậy trên OS X, sau đây sẽ làm việc:

#!/usr/bin/env perl -wT 
enter code here 

Tuy nhiên, vì một trong những điểm sử dụng #!/Usr/bin/env là để tăng cường khả năng tương thích nền tảng, có lẽ tốt nhất là không nên sử dụng cú pháp đó ngay cả khi bạn đang sử dụng máy Mac.

Các vấn đề liên quan