Tại sao tôi không gặp bất kỳ lỗi cú pháp nào khi thực thi tập lệnh Python của mình với Perl?


85

Tôi vừa viết một số mã python thử nghiệm vào test.pyvà tôi đang khởi chạy nó như sau:

perl test.py

Sau một thời gian tôi nhận ra sai lầm của mình. Tôi nói "sau một lúc", bởi vì mã Python thực sự được thực thi chính xác, như thể trong trình thông dịch Python!

Tại sao Perl của tôi lại thông dịch Python của tôi? test.pytrông như thế này:

#!/usr/bin/python

...Python code here...

Thật thú vị, nếu tôi làm ngược lại (tức là gọi điện python something.pl), tôi sẽ gặp rất nhiều lỗi cú pháp.


6
Tôi đoán đó là do #!phần đầu của tập tin. Thật vậy, nếu tôi loại bỏ she-bang, tôi sẽ nhận được hành vi như mong đợi. Dù sao thì đó không phải là một ý tưởng tồi từ góc độ bảo mật phải không?
Dacav

7
Không. Điểm của đường dẫn shebang nó để chỉ định một trình thông dịch. Nếu bạn không tin tưởng mã để chạy, thì bạn không nên chạy nó ngay từ đầu.
Sobrique

1
Không thật sự lắm. Tập lệnh của bạn là một tệp văn bản. Không nhiều không ít. Nó sẽ không 'chạy' nếu không có thông dịch viên.
Sobrique

4
"Tại sao Perl của tôi lại thông dịch Python của tôi?" không phải là "một vấn đề không thể tái tạo được nữa hoặc một lỗi đánh máy đơn giản." Đã bỏ phiếu để mở lại. Các phiếu tán thành trên Q và A cho thấy đây là một câu hỏi được nhiều người quan tâm.
ikegami

1
@ikegami Bất kể mức độ phổ biến, đây rõ ràng không phải là "một lỗi đánh máy đơn giản ... được giải quyết theo cách không có khả năng giúp ích cho người đọc trong tương lai." Đã bỏ phiếu để mở lại.
ThisSuitIsBlackNot

Câu trả lời:


114

Từ perlrun ,

Nếu #!dòng không chứa từ "perl" cũng như từ "indir" thì chương trình có tên sau #!nó được thực thi thay vì trình thông dịch Perl. Điều này hơi kỳ lạ, nhưng nó giúp ích cho những người sử dụng máy không làm như vậy #!, vì họ có thể nói với một chương trình rằng SHELL của họ là / usr / bin / perl , và Perl sau đó sẽ gửi chương trình đến trình thông dịch chính xác cho họ.

Ví dụ,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
Chà. Nói về những đặc điểm khó hiểu của bạn. Tôi đã sử dụng Perl hơn 20 năm và tôi không biết nó lại làm được điều đó.
cjm

4
Tôi bắt đầu sử dụng Perl v4 trên DOS, VMS & Solaris. Đó là các tính năng bất khả tri / bắc cầu của hệ điều hành như thế này đã giúp cuộc sống đa nền tảng trở nên dễ dàng hơn rất nhiều.
tjd

1
@MarcvanLeeuwen Khi bạn viết các chương trình cho Linux, OSX, VAX / VMS, Windows, Solaris, OS / 2, và bất cứ điều gì khác, phần khó chịu nhất của việc chuyển một chương trình ngôn ngữ tập lệnh là nó bắt đầu khởi động, mặc dù nhiều hệ thống này thường dùng chung tính năng "gõ lệnh, tìm thấy và thực thi", thực hiện gần như mọi thứ khác nhau. Tính năng này làm cho Perl Perl một khoảng cách cầu dễ dàng trong chức năng - bạn có thể viết chỉ một công việc Unix-phong cách và nếu Perl là hiện tại mã, liệu mã Perl hay không, sẽ luôn luôn làm việc - nó giống như một phổ biến hơn #! /usr/bin/env foo.
zxq9,

1
@immibis Từ luồng Shebang phân tích cú pháp bí ẩn trên danh sách gửi thư perl5-porters: " indirlà một chương trình được thiết kế để thực thi gián tiếp các chương trình khác. Hồi ức của tôi là nó được cho là đặc biệt hữu ích trong các tình huống khó giải quyết mà hệ điều hành không cung cấp bạn giúp đỡ nhiều, và / hoặc có thể trong các tình huống mà nhân hệ điều hành giới hạn bạn trong 32 dòng lệnh ký tự. "
ThisSuitIsBlackNot

2
Điều này chỉ củng cố danh tiếng của Perl như một cái bếp của các ngôn ngữ lập trình. Như một quan sát thú vị, tôi tin rằng việc triển khai ban đầu của shebang là một tính năng của shell, nó chỉ chuyển sang nhân Unix sau đó. Perl bao gồm nhiều cơ chế shell (ví dụ: backticks để thay thế đầu ra lệnh), đây chỉ là một cơ chế nữa.
Barmar
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.