2009-07-14 10 views
14

मैं हास्केल में कुछ इस तरह कर सकते हैं:फ़ाइल की शुरुआत में #!/Usr/bin/... क्या होता है?

#!/usr/bin/runghc 
main=putStrLn "Hello World" 

तो मैं यह ./hello.hs

मेरा प्रश्न के साथ चला सकते हैं, यही कारण है कि पहली पंक्ति पर ध्यान नहीं दिया है? हैकेल में टिप्पणियां -- से शुरू होती हैं लेकिन पहली पंक्ति को अभी भी अनदेखा किया जाता है। यह भी ghci में लोड करता है। यह चाल पाइथन और पर्ल के साथ भी काम करती है।

लेकिन जब मैं जावा में कुछ इसी तरह कार्य करें:

#!/usr/local/jdk1.6.0_13/bin/javac 
... 

javac मुझे एक संकलक त्रुटि देता है।

तो यह कैसे काम करता है और मैं जावा के साथ काम करने के लिए कैसे प्राप्त करूं?

धन्यवाद।

+0

संभावित डुप्लिकेट [क्यों लोग पाइथन लिपि की पहली पंक्ति पर # लिखते हैं!/Usr/bin/env python?] (Http://stackoverflow.com/questions/2429511/why-do-people-write -usr-bin-env-python-on-the-first-line-of-a-python-script) –

उत्तर

15

#: ऐसे ही एक निर्माण मतलब होता है ... जो यह नहीं है ... यह कैसा लगेगा! "shebang" नाम दिया गया है और स्क्रिप्ट निष्पादित करने का यूनिक्स तरीका है। जब आप किसी फ़ाइल को निष्पादित करने के लिए ओएस से पूछते हैं तो यह पता लगाएगा कि यह सामान्य .exe फ़ाइल नहीं है, और #! शुरुआत में एक जादू मार्कर के रूप में कार्य करता है जो ओएस को # के बाद कमांड निष्पादित करने के लिए निर्देश देता है!और तारों के ऊपर है कि आदेश तो इस फाइल कि आदेश

का एक तर्क है, तो myfile.py

#!/usr/bin/python 

क्रियान्वित चल

$ /usr/bin/python myfile.py 

मेरे हास्केल ज्ञान है से उस फ़ाइल को बहुत अलग नहीं है शामिल हो जाता है गरीब। लेकिन आपके विशेष मामले के लिए ऐसा लगता है कि runghc कमांड बस पहली पंक्ति पढ़ता है, उस # पर दिए गए किसी भी तर्क को पार करता है! लाइन, बाकी फाइल को एक अस्थायी फ़ाइल में लिखती है और उस अस्थायी फ़ाइल पर ghc चलाती है (जिसमें पहली लीन छीन ली जाएगी - अधिक जानकारी के लिए ghc स्रोतों में runghc.hs देखें।)

यदि आप चाहते थे javac के साथ वही काम करें आप runghc के समान दृष्टिकोण का उपयोग कर सकते हैं। एक रैपर लिखें, जो फ़ाइल की पहली पंक्ति खाता है, बाकी फ़ाइल को एक temp फ़ाइल में लिखता है और उस फ़ाइल पर javac चलाता है।

+1

पाठ फ़ाइल मानक इनपुट नहीं बनती है। मूल कमांड लाइन (संभावित रूप से पाठ फ़ाइल के नाम पर पथ पथ जानकारी के साथ) शेबैंग लाइन पर पाए गए कमांड में संलग्न है। मूल मानक इनपुट विस्तारित कमांड के लिए मानक इनपुट बनी हुई है। – dave4420

+0

हाँ, क्षमा करें। इसे ठीक किया – nos

+0

अस्वीकरण: मुझे थोड़ा जावा पता है। लेकिन #foo जावा में एक टिप्पणी है? मुझे पता है कि यह (जानबूझकर ऐसा है) * निक्स पर अधिकांश स्क्रिप्टिंग भाषाओं में ताकि आपको पहली पंक्ति को अलग करने की चिंता न करें। –

5

अपनी फ़ाइल hello.hs है, और पहली पंक्ति है, तो खोल निष्पादित करेंगे "#/usr/bin/runghc!":

/usr/bin/runghc hello.hs 

कि पहली पंक्ति मूल रूप से करने के लिए खोल क्या कहता है स्क्रिप्ट चलाने के लिए उपयोग करें।

जावा उदाहरण के लिए के रूप में, पहली पंक्ति निष्पादन योग्य है कि रन स्क्रिप्ट, नहीं है कि संकलित स्क्रिप्ट होना चाहिए।

+0

"टर्मिनल" के लिए "खोल" विकल्प और आपको यह सही मिला – ennuikiller

+0

@ennuikiller: शायद ही कभी। – tripleee

1

कुटिया केवल व्याख्या की भाषाओं के साथ काम करता है .... यह आम तौर पर एक संकलक जो ज्यादातर मामलों

0

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

0

जावैक एक कंपाइलर है, न कि एक दुभाषिया।

इसमें इंटरैक्टिव मोड की कमी है जो मुझे विश्वास है कि 'जादू' का कारण क्या है। वही जीसीसी के साथ काम नहीं करेगा क्योंकि इसमें एक ही सुविधा की कमी है।

डीएमडी (डी डी कंपाइलर) उदाहरण के लिए, एक कंपाइलर का एक उदाहरण है जो इंटरपरेटेशन का समर्थन करता है इस तरह के इंटरैक्टिव संपादन (#!/Usr/bin/dmd -run) है।

0

यह आपकी स्क्रिप्ट की व्याख्या करने के लिए आपके कंप्यूटर पर निष्पादन योग्य स्थान है। जावा एक संकलित भाषा है, इस प्रकार इसे इस तरह के बयान की आवश्यकता नहीं है।

इसके अलावा, बिंदु यह है कि यह एक विशेष टिप्पणी है, जावा में निर्माण इस तरह से कानूनी नहीं होगा क्योंकि # एक कानूनी टिप्पणी मार्कर नहीं है।

//!/usr/local/jdk1.6.0_13/bin/javac

2

मेरा सवाल है, पहली पंक्ति को क्यों नजरअंदाज किया जाता है? हैकेल में टिप्पणियां शुरू होती हैं - लेकिन पहली पंक्ति को अभी भी अनदेखा किया जाता है। यह भी ghci में लोड करता है। यह चाल पाइथन और पर्ल के साथ भी काम करती है।

'चाल' अजगर और पर्ल में काम करता है क्योंकि # उन भाषाओं में एक टिप्पणी शुरू होता है, तो दुभाषिया एक टिप्पणी के रूप में है कि रेखा को देखता है और यह ध्यान नहीं देता। तो उनके लिए, यह कुछ खास नहीं है।

हास्केल में, # कोई टिप्पणी शुरू नहीं करता है, इसलिए यह सामान्य रूप से काम नहीं करेगा। हालांकि, जीएचसी (शायद अन्य कार्यान्वयन, अगर मेमोरी परोसता है, तो गले लगाते हैं) शेबांग लाइनों के लिए एक विशेष मामला है। यदि फ़ाइल की पहली पंक्ति #! से शुरू होती है, तो इसे एक टिप्पणी के रूप में माना जाता है। भाषा विनिर्देश से यह विचलन

$ chmod +x hello.hs 
$ ./hello.hs 

कार्य करने के लिए बिल्कुल शामिल किया गया है। यह javac के साथ काम नहीं करता है क्योंकि शेबांग लाइनों के लिए इसमें कोई विशेष मामला नहीं है।

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