2012-01-29 14 views
16
-tt

मुझे पता है कि है .sh बैश स्क्रिप्ट की शुरुआत मेंलिनक्स स्क्रिप्ट में इसका क्या अर्थ है? #!/Usr/bin/अजगर

#!/bin/bash 

जो निष्पादन interpeter आदेश को इंगित करता है।

लेकिन गूगल अजगर कक्षा http://www.youtube.com/watch?v=tKTZoB2Vjuk देख दौरान मैंने देखा है कि अजगर के लिए वे

#!/usr/bin/python -tt 

का उपयोग करें।

#!/usr/local/bin/python 

और यहां तक ​​कि

#!/usr/bin/env python 

: इंटरनेट पर सर्फिंग मैं भी इस अंकन के ऐसे शैलियों मिल गया है।

तो, मैं अजगर के साथ नए हूँ और मैं साधारण लिनक्स उपयोगकर्ता हूँ और मैं इस "जादू" रेखा के बारे में कुछ प्रश्न हैं:

  1. सबसे पहले, इस लाइन का सही रूप है क्या ? और क्यों?
  2. क्या कुंजी का मतलब #!/Usr/bin/python -tt में है?
  3. लिनक्स में इस लाइन को पार करने वाला कौन सा प्रोग्राम है?
  4. किसी भी स्क्रिप्ट के लिए इस लाइन का वाक्यविन्यास क्या है?
  5. यदि प्रत्येक फ़ाइल में इसका विस्तार है तो यह लाइन इतनी जरूरी क्यों है?
  6. और किसी भी प्रकार की स्क्रिप्ट के लिए प्रत्येक कंप्यूटर दुभाषिया में इसके बारे में क्या होगा, दूसरे स्थान की तुलना में अलग-अलग जगहों पर संग्रहीत किया जाएगा? और लिपि नहीं चलाया जा सका।

यह मेरे लिए वास्तव में दिलचस्प है। यह लाइन क्या है? यह लाइन क्यों? इस लाइन को कैसे लिखें? क्यों इस तरह से ...

उत्तर

15

प्रश्न # 1) रेखा को शेबांग कहा जाता है, और कोई सही रूप नहीं है जो सार्वभौमिक रूप से काम करता है। जैसे

#!python 
#!/usr/bin/python 
#!/usr/local/bin/python 
#!/usr/bin/python -t 

सभी वैध/स्वीकार्य रूप हैं, लेकिन सभी सिस्टम पर काम नहीं हो सकता है:

#!python काम करेंगे केवल अगर पायथन निष्पादन अपने खोल के मार्ग में कहीं है

#!/usr/bin/python केवल अजगर अगर काम करता है द्विआधारी वास्तव में है/usr/bin

#!/usr/local/bin/python भी तभी काम करता है अजगर/usr/स्थानीय/बिन

में है सुरक्षा प्रॉम्प्ट पर

$ python -t somescript.py 

: ०५३६९१३६३२१०

प्रश्न # 2)

#!/usr/bin/python -tt, अजगर को -tt विकल्प गुजर रहा है के रूप में यदि आप कर चाहते हैं। आप शेबांग लाइन पर दुभाषिया को आर्बिटरी कमांड लाइन तर्क पारित कर सकते हैं।

प्रश्न # 3)

लाइन ओएस गिरी और खोल आप वर्तमान में उपयोग कर रहे हैं के द्वारा स्वीकार किया गया। #! के बाद सामान बस ओएस को बताता है कि शेष स्क्रिप्ट को "निष्पादित" करने के लिए प्रोग्राम को निकाल दिया जाना चाहिए।

प्रश्न # 4)

स्क्रिप्ट वाक्यविन्यास भाषा का उपयोग कर रहे पर निर्भर करता है। जैसे एक PHP खोल स्क्रिप्ट

#!/usr/bin/php 
<?php 
    ... php code here ... 

एक #!/usr/bin/perl पर्ल स्क्रिप्ट का रूप ले लेना चाहिए पर्ल वाक्य रचना, आदि का उपयोग करना चाहिए ... आप एक पर्ल कुटिया के साथ PHP कोड डाल, तो आप बस पर्ल के साथ पटकथा barf होगा वाक्यविन्यास त्रुटियों, पीएचपी कोड के रूप में नहीं पर्ल कोड

प्रश्न # 5)

Shebangs यूनिक्स प्रणालियों, जहां फ़ाइल एक्सटेंशन वास्तव में ओएस के लिए फ़ाइल प्रकारों की पहचान करने के लिए कभी नहीं इस्तेमाल किया गया है। एक .c फ़ाइल को सी भाषा स्रोत कोड फ़ाइल समझा गया था, लेकिन यह केवल एक सम्मेलन है। आप एक बैश खोल स्क्रिप्ट को .c फ़ाइल में डाल सकते हैं, इसे निष्पादन योग्य बना सकते हैं, और #!/bin/bash शेबैंग के साथ, यह बैश स्क्रिप्ट के रूप में निष्पादित होगा।

फ़ाइल एक्सटेंशन द्वारा निष्पादन योग्य प्रकार निर्धारित करना विंडोज़ चीज़ से अधिक है।

प्रश्न # 6)

कि वापस # 1 प्रश्न में चला जाता है सामान - कुटिया का दावा है दुभाषिया कि वह कहाँ है, इस विशेष स्क्रिप्ट जब तक मामला है निष्पादित नहीं किया जा सकता है की तुलना में कुछ अन्य पथ पर है अगर तय, या दुभाषिया स्थानांतरित हो गया है। शेबांग बहुत आसान हैं, लेकिन अचूक नहीं हैं।

शुक्र है, सबसे दुभाषिए काफी मानक स्थानों में इन दिनों स्थापित कर रहे हैं, तो यह कुछ हद तक (माना) पर्ल पर /some/wonky/weird/path के बजाय /usr/bin

+0

आपने अपनी बिंदु 1 की सूची में '#!/Usr/bin/env python' विकल्प छोड़ा। कुछ विशेष कारण? – joaquin

+0

woops, उसको याद किया। 'env' एक यूनिक्स ऐप है जो वर्तमान पर्यावरण वर्रों/मानों को प्रिंट करता है। अधिकांश गोले पर, आप एक एसएनएमईएआर = वैल्यू नेम_of_app' कर सकते हैं ताकि एक एएनवी var (एस) को परिभाषित किया जा सके जो उस ऐप पर्यावरण के भीतर उपस्थित होना चाहिए। '/ usr/bin/env python' करने से केवल सभी मौजूदा पर्यावरण चर को पाइथन में मौजूद किया जा सकता है। –

+0

"-tt" के लिए shadyabhi का जवाब देखें। –

6

मैनपेज से:

आयकर जारी करना एक चेतावनी है जब एक स्रोत फ़ाइल एक तरह से यह की कीमत पर निर्भर करता है कि में खरोज के लिए टैब और रिक्त स्थान घुलमिल एक टैब रिक्त स्थान में व्यक्त किया गया। विकल्प को दो बार दिया जाने पर त्रुटि जारी करें।

  1. पंक्ति के दाईं रूप से एक का उपयोग करना चाहते है।
  2. यह दुभाषिया है जो इस पंक्ति को shebang के रूप में जाना जाता है। यदि आप "#!/Usr/bin/python" के रूप में पहली पंक्ति के साथ एक पायथन लिपि लिखते हैं तो & इसे बैश का उपयोग करके आमंत्रित करें, यह/bin/sh दुभाषिया है जो पहली पंक्ति पढ़ता है और उचित दुभाषिया शुरू करता है।
  3. यह एक शेबांग है। फीचर के सिंटैक्स में वर्ण अनुक्रम #!, यानी संख्या चिह्न और विस्मयादिबोधक बिंदु वर्ण
  4. फ़ाइल एक्सटेंशन लिनक्स आम तौर पर में प्रासंगिक नहीं हैं। आपके पास एक पायथन स्क्रिप्ट हो सकती है जिसमें एक .py एक्सटेंशन नहीं है।

पूर्व के लिए।

[email protected] ~ $ cat a 
print "Hello World" 
[email protected] ~ $ python2 a 
Hello World 
[email protected] ~ $ 

भी shebangs केवल आवश्यक अगर आप इस मामले में के रूप में $।/स्क्रिप्ट का उपयोग कर आप दुभाषिया आप उपयोग करना चाहते का उल्लेख नहीं था एक स्क्रिप्ट शुरू करना चाहते हैं।

1
  1. # स्थापित खोजने के लिए असामान्य होगी!/Usr/bin/env अजगर
  2. असंगत टैब उपयोग
  3. कर्नेल
  4. #!/path_to_the_interpreter या/usr/bin/env के बारे में
  5. मुद्दा त्रुटियों
  6. * nix extensinon जाँच नहीं करता है एक टी सभी (सिवाय कुछ डे कर सकता है कि)
  7. यह वह जगह है तुम क्यों # का उपयोग करना चाहिए!/usr/bin/env

अधिक जानकारी wiki

+0

'#!/Usr/bin/env python' आपको पायथन दुभाषिया को' -tt' विकल्प (या कोई अन्य विकल्प) पास करने की अनुमति नहीं देता है। यह भी देखें [यह प्रश्न] (http://unix.stackexchange.com/q/29608/10454) और [यह उत्तर] (http://unix.stackexchange.com/a/29620/10454)। –

+0

@ किथ थॉम्पसन जो वास्तव में गलत है: '#!/Usr/bin/env python -tt' का उपयोग करके काम करता है और वास्तव में अनुरोध किया जाता है:' pttth' में पहले 'पाथ' में पाया गया 'पायथन' दुभाषिया चलाता है '-tt' विकल्प के साथ , प्रश्न में लिपि के बाद। –

+0

@ जोनाथन कैलेन: मेरे सिस्टम पर नहीं (उबंटू 11.04); मुझे '/ usr/bin/env: पायथन -tt: ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती है। सोलारिस 9 पर, यह स्क्रिप्ट को 'पायथन' के साथ बुलाता है, लेकिन ऐसा लगता है कि '-tt' को अनदेखा किया जाता है। आप किस प्रणाली का उपयोग कर रहे हैं? –

0

पर अलग अलग रास्तों जहां अजगर दुभाषिया के लिए कर रहे स्थापित कर दिया गया है। लिनक्स के विभिन्न स्वाद इसे विभिन्न स्थानों पर स्थापित करते हैं।

लिनक्स एक्सटेंशन की देखभाल नहीं करता है इसकी विंडोज चीज।

बैश सत्र आपके चल रहे स्क्रिप्ट के लिए सही दुभाषिया को कॉल करने के लिए लाइन का उपयोग करता है।

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

मैं लिनक्स/यूनिक्स पर एक पुस्तक प्राप्त करने और फ़ाइल सिस्टम की मूल बातें सीखने का सुझाव दूंगा। यह बहुत मदद करता है।

-1

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

सबसे पहले, इस लाइन का सही रूप क्या है? और क्यों?

सही पथ जहां भी आपका पाइथन दुभाषिया स्थापित है। तर्क (-tt) आप जो चाहते हैं उस पर निर्भर करेगा। कुछ लोग #!/usr/bin/env पर जोर देते हैं यदि दुभाषिया कहीं भी होता है।

क्या कुंजी का मतलब #!/Usr/bin/python -tt में है?

मैं अजगर का उपयोग नहीं करता, इसलिए किसी और को इसका उत्तर देना होगा।

जब मैं लिनक्स में कोई स्क्रिप्ट लॉन्च करता हूं (सटीक पायथन स्क्रिप्ट नहीं) कौन सा प्रोग्राम इस पंक्ति का विश्लेषण करता है और इसका उपयोग करता है? मुझे लगता है कि यह बाश नहीं है क्योंकि बैश स्क्रिप्ट के लिए भी इस लाइन की आवश्यकता है।

मैंने सुना है (और मुझे पूरा यकीन है) यह कर्नेल है। यहां तक ​​कि अगर यह बाश था, तो उसे बश को बताने की लाइन की आवश्यकता होगी, इसे एक स्क्रिप्ट माना जाना चाहिए जिसे किसी दूसरे कार्यक्रम में जाने के बजाय व्याख्या करना चाहिए। /usr/bin/env एक आदेश है जो निर्दिष्ट तर्क के लिए PATH खोजता है और इसे प्राप्त प्रोग्राम के माध्यम से स्क्रिप्ट पास करता है।

किसी भी स्क्रिप्ट के लिए इस पंक्ति का वाक्यविन्यास क्या है? और इंटरपेटर का नाम क्या है जो इसे पार करता है?

वाक्य रचना एक कमांड लाइन, #!command arguments के रूप में ही है, लेकिन command एक निरपेक्ष पथ हो गया है, PATH खोजा नहीं होती है।

यदि प्रत्येक फ़ाइल में इसका विस्तार है तो यह लाइन इतनी जरूरी क्यों है?

एक्सटेंशन का अर्थ * निक्स में कुछ भी नहीं है। मैं बिना किसी विस्तार के बैश स्क्रिप्ट script.pl, script.exe, या script नाम भी दे सकता हूं। यदि स्क्रिप्ट में सही शेबांग लाइन है, तो यह सही दुभाषिया के माध्यम से पारित हो जाती है, अन्यथा कर्नेल इसे निष्पादन योग्य के रूप में निष्पादित करने की कोशिश करता है और विफल रहता है। सिस्टम एक्सटेंशन के बारे में नहीं जानता है। वे उपयोगकर्ताओं के लिए एक सम्मेलन हैं, और कुछ नहीं।

और किसी भी प्रकार की स्क्रिप्ट के लिए प्रत्येक कंप्यूटर दुभाषिया में इसके बारे में क्या होगा, दूसरे स्थान की तुलना में अलग-अलग जगहों पर संग्रहीत किया जाएगा? और लिपि नहीं चलाया जा सका।

यदि मैं यह सही ढंग से समझ, तुम कह रहे हो विभिन्न प्रणालियों/वितरण विभिन्न स्थानों (जैसे /usr/bin/python और /usr/local/bin/python) में दुभाषियों रखने के लिए, और पूछ कैसे प्रणाली है जो उपयोग करने के लिए जानता है?
उत्तर है, यह उस व्यक्ति का उपयोग करता है जो आपके द्वारा दिए गए पूर्ण पथ पर है। यह वास्तव में निष्पादन योग्य स्क्रिप्ट के साथ एक मामूली समस्या है, और कारण /usr/bin/env प्रचलित है। जैसा कि मैंने कहा, env सही दुभाषिया के लिए PATH खोजता है, इसलिए जब तक आपके सिस्टम में /usr/bin/env है, तो आप सेट हैं, आपको दुभाषिया के स्थान को देखने या गारंटी देने की आवश्यकता नहीं है।

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