2014-08-29 6 views
9

मुझे लगता है कि ksh88 के लिए विशिष्ट है जो सिंगल कोट्स को डबल कोट्स में बदल रहा है, लेकिन केवल कुछ स्थितियों के तहत हेडॉक्स और कमांड प्रतिस्थापन शामिल है।ksh88 हेडॉक्स के अंदर दोहरे उद्धरणों के लिए सिंगल कोट्स बदल रहा है?

यहाँ एक उदाहरण है:

#!/bin/ksh 

# This example works correctly 
echo "Example 1:" 
cat <<EOF 
The 'quick' brown fox "jumped" over the lazy dog. 
EOF 
echo 


# This example is broken 
echo "Example 2:" 
var=$(cat <<EOF 
The 'quick' brown fox "jumped" over the lazy dog. 
EOF) 
echo "${var}" 
echo 


# This example works correctly 
echo "Example 3:" 
var=`cat <<EOF 
The 'quick' brown fox "jumped" over the lazy dog. 
EOF` 
echo "${var}" 
echo 

और यहाँ उत्पादन है (ध्यान दें कैसे उदाहरण 2 अलग है):

Example 1: 
The 'quick' brown fox "jumped" over the lazy dog. 

Example 2: 
The "quick" brown fox "jumped" over the lazy dog. 

Example 3: 
The 'quick' brown fox "jumped" over the lazy dog. 

'" के प्रतिस्थापन आदेश रन से पहले होने जा रहा है। वास्तविक संदर्भ में, हेरेडोक ओरेकल को एसक्यूएल पास कर रहा है। ' से " बदलकर, तारों को पहचानकर्ताओं में परिवर्तित किया जा रहा है, इस प्रकार एसक्यूएल तोड़ रहा है। यह उपरोक्त कोड के निष्पादन के दौरान xtrace को सक्षम करके भी देखा जा सकता है।

बैकटिक्स का उपयोग किये बिना उपरोक्त कोड स्निपेट में '" रूपांतरण को कैसे रोक सकता हूं?


संपादित करें: साजिश गाढ़ा हो। बैकटिक नोटेशन के साथ कमांड प्रतिस्थापन $(...) को प्रतिस्थापित करने से सिंगल कोट्स को डबल कोट्स से प्रतिस्थापित नहीं किया जाता है। तो (वैकल्पिक) प्रश्न दो: क्यों?

+3

वर्णित व्यवहार एक बग की तरह लगता है। बैक-टिक्स को '$ (...)' में बदलना, आउटपुट की सामग्री को नहीं बदला जाना चाहिए। क्या आप ['ksh93'] (http://www.kornshell.com/) में अपग्रेड नहीं कर सकते हैं? –

+0

@ जोनाथन लेफ्लर - यदि यह एक बग है, तो यह बहुत डर जानबूझकर दिखता है। Ksh93 पर स्विच करने के लिए, यह एक विकल्प नहीं है। वास्तविक स्क्रिप्ट को विभिन्न संस्करणों के एकाधिक AIX और Solaris सर्वर पर चलने की आवश्यकता है। कुछ में ksh93 है, लेकिन अधिकांश में केवल ksh88 है। –

+0

@ एड्रियनफ्रुहर्थ - '$ {var}' echo 'echo "$ {var}" उपरोक्त सभी मामलों में समान परिणाम उत्पन्न करें। यदि आप xtrace '#!/Bin/ksh -x' को सक्षम करते हैं तो आप प्रदर्शित होने से पहले 'var' के मान को देख सकते हैं। मॉडल प्रश्न के लिए –

उत्तर

5

मेरे नोट्स यहां दिए गए हैं जब मैंने कई साल पहले इसी बग की खोज की थी।

टेस्ट स्क्रिप्ट: विभिन्न गोले के लिए

#!/bin/ksh 
cat <<EOF 
    $PWD "$PWD" '$PWD' 
EOF 
echo `cat <<EOF 
    $PWD "$PWD" '$PWD' 
EOF 
` 
echo $(cat <<EOF 
    $PWD "$PWD" '$PWD' 
EOF 
) 

आउटपुट:

  • लिनक्स KSH संस्करण एम 1993/12/28 क्ष
  • लिनक्स बैश 3.00।15 (1)

(नोट: के रूप में की उम्मीद काम करता है)

/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
  • AIX संस्करण M-11/-16/88f
  • सोलारिस संस्करण M-11/-16/88i

(नोट: सिंगल कोट्स को डबल कोट्स और परिवर्तनीय प्रतिस्थापित नहीं किया गया है)

/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" '/home/jrw32982' 
/home/jrw32982 "/home/jrw32982" "$PWD" 

काम के आसपास:

  1. कंप्यूट यहाँ फ़ाइल

    abc=xyz 
    STR="'$abc'" 
    x=$(cat <<EOF 
        $abc "$abc" $STR 
    EOF 
    ) 
    
  2. सीधे

    fn() { 
        cat <<EOF 
        $abc "$abc" '$abc' 
    EOF 
    } 
    abc=xyz 
    x=$(fn) 
    
    के बजाय एक समारोह में यहां-फ़ाइल उपयोग से एकल उद्धृत स्ट्रिंग बाह्य
संबंधित मुद्दे