2012-07-03 17 views
6

मैं अपने सीपीएएन वितरणों को देख रहा था और महसूस किया कि मेरे पास मेरी .t स्क्रिप्ट्स के शीर्ष पर विभिन्न असंगत चीजें थीं, इस पर आधारित है कि मैं उन्हें कहां से दूंगा। यह निश्चित रूप से मुझे अपमानित करता है।पर्ल परीक्षण (.t) स्क्रिप्ट की पहली पंक्ति क्या होनी चाहिए?

तो, पर्ल परीक्षण (.t) स्क्रिप्ट की "सर्वश्रेष्ठ" पहली पंक्ति क्या है? मेरी .cpanm स्रोतों में से एक गैर-वैज्ञानिक सर्वेक्षण से पता चला है मुझे:

3429 use strict; 
3211 #!/usr/bin/perl 
1344 #!/usr/bin/env perl 
937 #!perl 
909 #!/usr/bin/perl -w 
801 #!perl -w 
596 
539 #!perl -T 

संबंधित What should I use for a Perl script's shebang line? लिए, लेकिन यहाँ मैं अगर कुटिया में सभी आवश्यक/उपयोगी है, परीक्षण हमेशा साबित से बुलाया होने की उम्मीद है, तो सोच रहा हूँ ।

+1

ओलेग - सुनिश्चित नहीं है कि आप इस प्रश्न से इतना नाराज क्यों हैं। कुछ .t फ़ाइलों में विभिन्न प्रकार की शेबांग लाइनें होती हैं और कुछ में कोई भी नहीं है। बस सोच रहा है कि क्या कोई अच्छा अभ्यास है या यदि इससे कोई फर्क पड़ता है। –

+0

मुझे नाराज नहीं है। मेरे पास इस पर ध्यान देने के लिए बिल्कुल दो चीजें हैं: किसी भी अन्य पर्ल स्क्रिप्ट से कोई फर्क नहीं पड़ता - उत्तर में शामिल है, और शेबैंग विशिष्ट ओएस (पूर्व-निरीक्षण में बहुत सुविधाजनक नहीं) के झुकाव हैं। मेरे उत्तर का निचला बिंदु: उनके बारे में चिंता न करें - यह बेकार है, या कम से कम सिर्फ उन्हें किसी अन्य स्क्रिप्ट के रूप में व्यवहार करें। –

+1

यह बहुत खराब है यह बंद था। साबित होने के तहत चल रहे सामान्य पर्ल स्क्रिप्ट और स्क्रिप्ट के बीच तथ्यात्मक अंतर हैं। विशेष रूप से, यदि आप अपने परीक्षण को टैनटिंग के तहत चलाने के लिए चाहते हैं (मैं आमतौर पर नहीं करता हूं, भले ही यह एक अच्छा विचार है), तो आपको कम से कम "#! Perl -T" होना चाहिए, इसलिए पेर्ल सक्षम होने के साथ शुरू हो जाएगा। सैद्धांतिक रूप से, वाउ ध्वज वैश्विक चेतावनियों को सक्षम करने के लिए उपयोगी होना चाहिए, लेकिन साबित होता है कि पहले से ही यह जोड़ा गया है (यह एक बग, आईएमओ है)। अन्य झंडे भी उपयोगी हो सकता है। नियमित स्क्रिप्ट के विपरीत, हालांकि, * नहीं * पहली पंक्ति पूरी तरह से व्यवहार्य है, अगर आपको इसकी आवश्यकता नहीं है। – Tanktalus

उत्तर

-2

.t फ़ाइलें अभी भी नियमित पर्ल स्क्रिप्ट हैं। पहली पंक्ति पर इस विशेष लिपि के लिए जो कुछ भी आपको चाहिए, उसका प्रयोग करें।

+2

यदि मैं सीपीएएन पर प्रकाशित करना चाहता हूं तो यह केवल एक चीज नहीं है जो मुझे चाहिए। सवाल यह है कि ज्यादातर लोगों को क्या चाहिए और मुझे लगता है कि सबसे पोर्टेबल क्या है। –

+1

वे अभी भी ** एक अलग नहीं हैं **, मुझे समझ में नहीं आता कि आपको अलग प्रश्न की आवश्यकता क्यों है। इसके अलावा, शेबैंग सिर्फ एक यूनिक्स आर्टिफैक्ट हैं। बस इसके बारे में मत सोचो। जो भी परीक्षण चलाने के लिए चाहते हैं या तो perl या साबित करेंगे। –

2

use strict; हर पर्ल कार्यक्रम (और साथ ही use warnings; और शायद कुछ अन्य लोगों (जो तुमसे बात) निर्भर करता है में होना चाहिए। यह पहली लाइन होने की जरूरत नहीं है।

सामान के बाकी आप वर्तमान में shebang के कई संस्करण हैं। यूनिक्स और यूनिक्स आधारित सिस्टम पर, शेबैंग का उपयोग करने के लिए दुभाषिया को बताने के लिए उपयोग किया जाता है। यदि शेबैंग नहीं है, तो वर्तमान खोल का उपयोग किया जाएगा। (यानी, यदि आपका खोल शेबैंगका समर्थन करता है 1.)

यदि आप विंडोज सिस्टम पर हैं, तो शेबैंग लाइन बेकार है। फ़ाइल को निष्पादित करने का तरीका जानने के लिए विंडोज फ़ाइल के प्रत्यय का उपयोग करता है।

सवाल यह है कि क्या आपको टेस्ट दोहन के माध्यम से चलाने वाली स्क्रिप्ट में शेबैंग लाइन की भी आवश्यकता है या नहीं। मैं आम तौर पर इन टेस्ट स्क्रिप्ट को व्यक्तिगत रूप से निष्पादित नहीं करता हूं, इसलिए वास्तव में शेबैंग की आवश्यकता नहीं हो सकती है। दुर्लभ घटना में आप इन स्क्रिप्ट्स में से किसी एक को निष्पादित करना चाहते हैं, आप उन्हें हमेशा perl कमांड के लिए तर्क के रूप में चला सकते हैं। पर्ल मॉड्यूल के साथ भी यही सच है।

तो, शेबांग क्यों? मुख्य रूप से आदत। मैंने अपनी टेस्ट स्क्रिप्ट्स और मेरे मॉड्यूल पर भी एक लगाया। यदि कुछ और नहीं है, तो परीक्षण उद्देश्यों के लिए स्वतंत्र रूप से मॉड्यूल चलाने और परीक्षण स्क्रिप्ट को चलाने में आसान बनाता है। इसके अलावा, शेबैंग लोगों को यह जानने देता है कि यह एक पर्ल स्क्रिप्ट है, न कि शैल स्क्रिप्ट या पायथन स्क्रिप्ट।

हालांकि शेबैंग के साथ एक छोटी सी समस्या है, और उसे पोर्टेबिलिटी के साथ करना है। अगर मैंने अपनी पहली पंक्ति पर #! /usr/bin/perl डाला है, और पर्ल दुभाषिया #! /usr/local/bin/perl में है, तो मुझे एक त्रुटि मिलेगी। इस प्रकार, शेबैंग में से कई उस डेवलपर के लिए पर्ल दुभाषिया के स्थान को प्रतिबिंबित करते हैं।

एक और मुद्दा भी है: मैं Perlbrew का उपयोग करता हूं जो मुझे पर्ल के कई संस्करणों को स्थापित करने की अनुमति देता है। वर्तमान में मेरे खोल में पर्ल I का संस्करण /Users/David/perl5/perlbrew/perls/perl-5.18.0/bin/perl पर है। यह अच्छा नहीं है अगर मैं किसी अन्य सिस्टम पर किसी अन्य उपयोगकर्ता को उस प्रोग्राम को पास करता हूं। या, अगर मैं फैसला करता हूं कि मैं अपनी पर्ल स्क्रिप्ट का परीक्षण 5.10 के तहत करना चाहता हूं।

#! perl संस्करण इसे हल करने का प्रयास है। सनोस पर (मुझे विश्वास है), यह आपके $PATH में पर्ल निष्पादित करेगा (क्योंकि यह /usr/local/bin/perl या /usr/share/bin/perl या /usr/bin/perl सिस्टम के आधार पर हो सकता है)। हालांकि, यह अधिकांश यूनिक्स बक्से पर काम नहीं करता है।उदाहरण के लिए, मेरे मैक पर, मुझे एक खराब दुभाषिया त्रुटि मिल जाएगी।

मैं #! /usr/bin/env perl का उपयोग करता हूं। env प्रोग्राम perl तर्क लेता है, देखता है कि perl मेरे $PATH पर है, और फिर मेरे $ PATH पर जहां भी पर्ल होता है, उसका पूरा पथ निष्पादित करता है। शेबैंग और जिस तरह से मैं अनुशंसा करता हूं, यह करने का यह सबसे सार्वभौमिक तरीका है। यह बिना किसी समस्या के पर्र्लब्रू का उपयोग करने के लिए उपयोग की अनुमति देता है।

नोट, मैंने कहा लगभग सार्वभौमिक, और सार्वभौमिक नहीं। लगभग सभी प्रणालियों पर, env/usr/bin में स्थित है, लेकिन वहां स्पष्ट रूप से कुछ सिस्टम हैं जहां env या तो /bin पर स्थित है, या कहीं भी सिस्टम पर नहीं है।

-w पर्ल निष्पादित करते समय चेतावनियों को चालू करता है। पर्ल 5.6 से पहले, आपने चेतावनियों को चालू करने के लिए इसका इस्तेमाल किया था। पर्ल 5.6 के बाद, आप अधिक लचीला use warnings; और -w का उपयोग कर सकते हैं अब को बहिष्कृत माना जाता है। कार्यक्रम इसका उपयोग कर सकते हैं क्योंकि वे मूल रूप से पूर्व 5.6 लिखा गया था, और कभी संशोधित नहीं किया गया था या डेवलपर ने बस आदत से बाहर किया था।

-Ttaint mode के साथ करना है। आमतौर पर सीजीआई स्क्रिप्टिंग के लिए टेंट मोड का उपयोग किया जाता है। असल में, टेंट मोड में, किसी प्रोग्राम के बाहर से डेटा को दंडित किया जाता है और अनचाहे तक इसका उपयोग नहीं किया जा सकता है। टेंट मोड @INC और PERLLIB को भी प्रभावित करता है।

वास्तविक जवाब यह है कि कोई सेट उत्तर नहीं है। मैं #! /usr/bin/env perl को आदत से बाहर अपनी पहली पंक्ति के रूप में रखूंगा - भले ही मैं यूनिक्स कमांड लाइन से उस फ़ाइल को निष्पादित करने की अपेक्षा न करें। इन प्रकार की स्क्रिप्ट्स के लिए इसके लिए कोई वास्तविक आवश्यकता नहीं है जो लगभग हमेशा कमांड लाइन से इंस्टॉल के हिस्से के रूप में निष्पादित की जाती हैं। आप जो देखते हैं वह वास्तव में पर्ल आदतों और क्रूर के 30 वर्षों का परिणाम है। जब तक आप बॉर्न शैल के एक 30 साल पुराने संस्करण या सी खोल का एक बहुत ही पुराने संस्करण का उपयोग कर रहे


1. आपका खोल मामला का समर्थन करता है।

2. मुझे वास्तव में पता नहीं है कि -w को आधिकारिक तौर पर बहिष्कृत किया गया है, लेकिन इसका उपयोग करने का कोई कारण नहीं है।

संबंधित मुद्दे