2013-07-03 2 views
14

मैं इस सवाल के जवाब में से एक को समझने के लिए कोशिश कर रहा हूँ:यह स्निपेट शेबैंग #!/बिन/sh और 4 सिंगल कोट्स के अंदर निष्पादन पायथन के साथ क्यों काम करता है?

Cannot pass an argument to python with "#!/usr/bin/env python"

#!/bin/sh 
''''exec python -u -- "$0" ${1+"[email protected]"} # ''' 

यह अच्छी तरह से काम करता है, लेकिन मुझे समझ नहीं आता क्यों यह नहीं बल्कि उस लाइन की शुरुआत में चार टिक के साथ काम करता तीन से अधिक।

इसके अलावा, उस स्ट्रिंग के अंत के पास हैश क्यों है?

'''something''' 

शैल का समर्थन करता है केवल एकल उद्धृत तार:

+0

बस ध्यान दें कि इस का शुभारंभ करेंगे * '$ PATH' में किसी भी * अजगर तो यह ** बहुत असुरक्षित **' # की तुलना में/usr/bin/env मैं है! पाइथन * * या * (यहां तक ​​कि बेहतर) पूर्ण पथ को जानना और उपयोग करना: '#!/usr/bin/python'। –

उत्तर

25

अजगर ट्रिपल उद्धृत तार का समर्थन करता है

'something' 

चार उद्धरण का उपयोग करके, sh देखता है कि के रूप में 2 रिक्त स्ट्रिंग है, लेकिन अजगर ट्रिपल-उद्धृत स्ट्रिंग की शुरुआत के रूप में पहले तीन को देखता है, और चौड़ाई को स्ट्रिंग मान के हिस्से के रूप में शामिल करता है।

शेष रेखा को sh द्वारा कमांड के रूप में व्याख्या किया जाता है, लेकिन पायथन द्वारा स्ट्रिंग के हिस्से के रूप में।

# तो एक टिप्पणी रूपों जहाँ तक sh का संबंध है, लेकिन यह अभी भी अजगर के लिए एक स्ट्रिंग है, यह बंद बंद करने के लिए एक बंद करने ट्रिपल उद्धरण के साथ।

तो, संक्षेप में प्रस्तुत करने के लिए:

  • sh देखता है: रिक्त स्ट्रिंग ('') - रिक्त स्ट्रिंग ('') - आदेश (exec python -u -- "$0" ${1+"[email protected]"}) - टिप्पणी (# ''')
  • पायथन देखता है: ट्रिपल-उद्धृत स्ट्रिंग शाब्दिक (वर्ण 'exec python -u -- "$0" ${1+"[email protected]"} #)

तो sh कि आदेश निष्पादित करता है, स्क्रिप्ट नाम और आदेश पंक्ति तर्क के बाकी के साथ python -u -- साथ ही जगह है, और अजगर इस फाइल को पढ़ता है और सिर्फ एक प्रारंभिक शाब्दिक स्ट्रिंग है जो कहीं भी नहीं जा रहा है देखता है।

क्योंकि यह फ़ाइल में पहली स्ट्रिंग अक्षर है, इसे __main__ मॉड्यूल के लिए डॉकस्ट्रिंग के रूप में सेट किया जाएगा, लेकिन यह शायद ही कोई फर्क नहीं पड़ता कि यह मुख्य स्क्रिप्ट है।

+0

'$ {1 +" $ @ "}' 'क्या है? यह '$ @' से अलग कैसे है? – Dog

+0

@ डॉग: इसका मतलब है: * यदि * पैरा 1 सेट किया गया है, तो विकल्प "$ @" '(उद्धृत पैरामीटर) विकल्प नल विकल्प। –

+0

क्या आप इस तथ्य के बाद डॉकस्ट्रिंग को संशोधित कर सकते हैं, मुझे आश्चर्य है? – Will

0

मैं बस का उपयोग करें:

#!/bin/sh 
''':' 
exec python -tt "$0" "[email protected]" 
''' 
# The above shell shabang trick is more portable than /usr/bin/env and supports adding arguments to the interpreter (python -tt) 
+0

स्वीकार्य उत्तर पर आपके समाधान का उपयोग करने का क्या फायदा है? – akhan

+0

यह पोस्ट किए गए प्रश्न का उत्तर नहीं देता है, इससे कोई फर्क नहीं पड़ता कि आप * क्या * उपयोग करते हैं, ओपी यह समझना चाहता है कि कोड का एक विशिष्ट टुकड़ा कैसे काम करता है। –

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