2011-10-09 14 views
26

मैं अपने पर्ल स्क्रिप्ट सीधे चलाने के लिए shebangs का उपयोग कर पसंद:उपयुक्त गो शेबांग लाइन क्या है?

#!/usr/bin/env perl 

जाओ कार्यक्रमों के लिए मामला क्या है?

+4

जाओ संकलित किया गया है। आपको एक शेबांग की आवश्यकता नहीं है। सही? –

+0

[गोलांग-नट्स में चर्चा धागा] (https://groups.google.com/d/msg/golang-nuts/iGHWoUQFHjg/hEhYPQjP3HcJ) जिसमें एक पोस्ट है [هومن جاویدپور] (http://stackoverflow.com/उपयोगकर्ता/10408 9 1) का [उत्तर] (http: // stackoverflow।कॉम/ए/17 9 0032/109747) –

उत्तर

9

गो कार्यक्रमों को बाइनरी में संकलित किया गया है; मुझे नहीं लगता कि उन्हें सीधे स्रोत से चलाने का विकल्प है।

यह अन्य संकलित भाषाओं जैसे सी ++ या जावा के समान है। कुछ भाषाएं (जैसे हास्केल) पूरी तरह से संकलित मोड और एक "स्क्रिप्ट" मोड दोनों प्रदान करती हैं जिन्हें आप सीधे शेबैंग लाइन के साथ स्रोत से चला सकते हैं।

+0

+1 वेरस पर्ल एक व्याख्या की गई स्क्रिप्टिंग भाषा है .... –

13

डिफ़ॉल्ट रूप से कोई नहीं है। गोरुन नामक एक थर्ड-पार्टी टूल है जो आपको ऐसा करने की अनुमति देगा। https://wiki.ubuntu.com/gorun

दुर्भाग्यवश कंपेलरों को शेबांग लाइन पसंद नहीं है। आप उसी कोड को संकलित नहीं कर सकते जो आप गोरुन के साथ चलाते हैं।

+0

अरग। 6 जी और दोस्त बोर्क जब वे एक शेबांग देखते हैं। – mcandre

+0

क्षमा करें, मुझे इसका उल्लेख करना चाहिए था। संपादित। –

34

//usr/bin/go run $0 [email protected] ; exit

उदाहरण:

///bin/true; exec /usr/bin/env go run "$0" "[email protected]" 

यह है: एक पंक्ति के रूप में

//usr/bin/go run $0 [email protected] ; exit 
package main 

import "fmt" 

func main() { 
    fmt.Println("Hello World!") 
} 

जाने इलाज // टिप्पणी और खोल अतिरिक्त उपेक्षा/

+1

क्या आप किसी भी गो फ़ाइल पर लागू करने के लिए शेबैंग को संपादित कर सकते हैं, न कि hello_world.go? शायद '$ 0' या ऐसे का उपयोग करें? – mcandre

+6

यह एक शेबांग लाइन नहीं है। इसे '#!' से शुरू होना चाहिए। (यह जानकर कि यह पसंद नहीं है)। यह गैर पोर्टेबल है, लेकिन शायद कई लोगों के लिए पर्याप्त है, इसलिए उत्तर के लिए +1। – topskip

+2

मुझे लगता है कि इस तरह लिखना बेहतर है: '/// usr/bin/env $ 0 $ @ चलाएं; बाहर निकलें – ivanzoid

11

मैं इस पसंद करते हैं هوم द्वारा उत्तर की तुलना में कई फायदे جاویدپور:

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

  • तर्कों का उचित उद्धरण। रिक्त स्थान और विशेष पात्र समस्याएं नहीं पैदा करेंगे।

  • अग्रणी "///" अधिक मानक "//" से अधिक मानक है। यदि आप केवल "//" का उपयोग करते हैं, तो आप कार्यान्वयन-परिभाषित व्यवहार में बंपिंग का जोखिम चलाते हैं। यहाँ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html से एक उद्धरण है:

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

मैं के साथ बैश, डैश, zsh, और ksh इस जवाब का परीक्षण किया है।

उदाहरण:

///bin/true; exec /usr/bin/env go run "$0" "[email protected]" 
package main 
import "fmt" 
func main() { 
    fmt.Println("你好!") 
} 
+1

मैं यह इंगित करना चाहता हूं कि यदि आपका प्रोग्राम os.Exit() एक गैर-शून्य निकास कोड के साथ है जो वास्तव में stderr पर प्रिंट कर रहा है और रन आउट 1 को इसके एक्ज़िट कोड के रूप में जाना है। – tmc

+0

यह هومن جاویدپور –

+2

का उत्तर भी सही है '/ bin/true' का उपयोग पोर्टेबल (उदा। ओएसएक्स और जेएसएच) – Kreisquadratur