2012-02-04 24 views

Trả lời

8

Một số hệ thống không nhận ra dòng #!/usr/bin/perl khi bắt đầu tập lệnh và do đó, cố gắng gọi chương trình Perl theo tên trên hệ thống như vậy sẽ chuyển kịch bản cho trình bao. Để chống lại điều này, các chương trình Perl di động bắt đầu bằng một dòng, khi được diễn giải bởi một vỏ POSIX tiêu chuẩn, thay vào đó, kịch bản sẽ được chuyển đến perl(1). if 0 làm cho dòng bị bỏ qua khi được chạy bởi Perl, và đặt nó trên một dòng riêng biệt làm cho các shell xử lý nó như một lệnh riêng biệt, chỉ chạy eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}' ngay khi nó được đọc.

+0

Cảm ơn, rất nhiều! Làm thế nào thông minh thực sự! –

+1

Tôi tự hỏi liệu có còn bất kỳ hệ thống đáng lo ngại nào về việc không hỗ trợ [shebangs] hay không (http://en.wikipedia.org/wiki/Shebang_ (Unix)). –

+2

Tôi có các kịch bản thực hiện việc này để chúng chạy dưới Solaris AND Linux. Các shebang trỏ đến một perl Solaris, nhưng dưới Linux kịch bản thực hiện như là shell, và dòng eval thực hiện một perl Linux. Các perls được cài đặt theo vị trí lẻ, nhưng các tập tin/thư mục được chia sẻ giữa các hệ thống thông qua NFS. – runrig

2

Dòng có giá trị dưới vỏ cũng như perl. Trong perl eval bị bỏ qua vì sau if 0. Trong trình bao, cùng một tệp được thực hiện trong perl bằng cách sử dụng eval.

+0

Vâng, id này làm rõ quá tốt. Cảm ơn một lần nữa! –

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