2015-10-29 10 views
10

मैं थोड़ी देर के लिए शेबैंग #! का उपयोग कर रहा हूं और आज मुझे उपयोग करने वाले मामले में आया है जो मुझे भ्रमित करता है।शेबांग "#!" शुरू होता है और "! #" समाप्त होता है?

वहाँ

#!/usr/bin/env scala 
println("hello world") 

हालांकि तरह स्केला स्क्रिप्ट चलाने के लिए कई तरीके हैं, मैं कुटिया के इस संस्करण में आए

#!/bin/sh 
exec scala "$0" "[email protected]" 
!# 
println("hello world") 

लग रहा है इस समाधान मूल रूप से पहले पार्टी का आह्वान तरह, रन exec scala "$0" "[email protected]" जहां $0 वर्तमान फ़ाइल नाम को इंगित करता है और [email protected] एक स्थितित्मक सरणी में इनपुट तर्क है।

मेरा प्रश्न है कि सब कुछ #! और !# के बीच पार्टी में क्रियान्वित किया जा सकता है,

#!/bin/sh 
exec scala "$0" "[email protected]" 
echo "oh Yeah" 
!# 
println("hello world") 

यह पता त्रुटि नहीं था लेकिन न तो "ओह, हाँ" stdout में, किसी को समझा सकता है मुझे दिया है क्या मतलब है मैं यहाँ क्या चल रहा हूँ?


अद्यतन: !# साकार करने के बाद एक स्केला बात है, मैं स्केला के स्रोत कोड डाउनलोड किया है और महसूस किया कि यह केवल लेक्स चम्मच द्वारा लिखित ScriptRunner.scala भाग की टिप्पणी में दिखाई देता है।

+3

'exec' नई प्रक्रिया के साथ वर्तमान प्रक्रिया को प्रतिस्थापित करता है। इसे चलाने के बाद कुछ भी नहीं। –

+0

@EtanReisner, तो इस मामले में नया दुभाषिया (स्केल दुभाषिया) कैसे जानता है कि इसे 'println()' से शुरू होना चाहिए और 'echo'' से शुरू नहीं होना चाहिए, जहां '! # 'का उपयोग किया जाता है? –

+0

दूसरे शब्दों में, यदि आप 'exec' से पहले रखे तो 'echo' दिखाई देने में सक्षम हो सकते हैं।पर्ल कुछ '[perldoc perlrun'] (http://perldoc.perl.org/perlrun.html) में कुछ संबंधित नोटेशन दस्तावेज करता है। –

उत्तर

9

!# लाइन का कोई मतलब खोल पर नहीं है।

#!/bin/sh लाइन का अर्थ है कि स्क्रिप्ट को /bin/sh द्वारा निष्पादित किया गया है। exec scala "$0" "[email protected]" लाइन scala को स्क्रिप्ट के नाम और scala कमांड के तर्कों को पारित करने के लिए आमंत्रित करती है। चूंकि exec वापस नहीं आता है, इसलिए शेल शेष स्क्रिप्ट नहीं देखता है।

मुझे स्कैला नहीं पता, लेकिन मेरा शिक्षित अनुमान यह है कि स्कैला दुभाषिया स्वयं #! लाइन से !# लाइन पर टिप्पणी के रूप में सब कुछ मानता है। इसके बाद स्कैला स्टेटमेंट println("hello world") के साथ निष्पादन शुरू होता है।

संक्षेप में !# स्काला वाक्य रचना है, वाक्य रचना शैल नहीं है (लेकिन स्काला वाक्य रचना यह एक खोल स्क्रिप्ट में इस तरह इस्तेमाल किया जा जाने के लिए डिज़ाइन किया गया है)।

Scala Language Specification पर एक त्वरित रूप से, मुझे पता नहीं चला कि यह कैसे परिभाषित किया गया है। इसका उल्लेख है, लेकिन this question में समझाया नहीं गया है। यह संभव है, क्योंकि चेपरर 3 की टिप्पणी से पता चलता है कि यह वास्तविक भाषा वाक्यविन्यास के भाग के बजाय स्कैला दुभाषिया में एक हैक है।

som-snytt स्काला दुभाषिया में कोड है कि इस here लागू करता पाया:

object ScriptSourceFile { 
    /** Length of the script header from the given content, if there is one. 
    * The header begins with "#!" or "::#!" and ends with a line starting 
    * with "!#" or "::!#". 
    */ 
... 

लेकिन मुझे आश्चर्य है कि क्या यह दस्तावेज़ीकरण किया गया है।

+3

दुभाषिया में खुद को एक हैक लगता है, क्योंकि शेबांग स्वयं स्कैला में कोई टिप्पणी नहीं है। – chepner

+1

यह यहां है: https://github.com/scala/scala/blob/2.11.x/src/reflect/scala/reflect/internal/util/SourceFile.scala#L71 –

+0

@ som-snytt: क्या आपको पता होना है क्या यह दस्तावेज है? –

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

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