मुझे लगता है कि 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 को सक्षम करके भी देखा जा सकता है।
बैकटिक्स का उपयोग किये बिना उपरोक्त कोड स्निपेट में '
"
रूपांतरण को कैसे रोक सकता हूं?
संपादित करें: साजिश गाढ़ा हो। बैकटिक नोटेशन के साथ कमांड प्रतिस्थापन $(...)
को प्रतिस्थापित करने से सिंगल कोट्स को डबल कोट्स से प्रतिस्थापित नहीं किया जाता है। तो (वैकल्पिक) प्रश्न दो: क्यों?
वर्णित व्यवहार एक बग की तरह लगता है। बैक-टिक्स को '$ (...)' में बदलना, आउटपुट की सामग्री को नहीं बदला जाना चाहिए। क्या आप ['ksh93'] (http://www.kornshell.com/) में अपग्रेड नहीं कर सकते हैं? –
@ जोनाथन लेफ्लर - यदि यह एक बग है, तो यह बहुत डर जानबूझकर दिखता है। Ksh93 पर स्विच करने के लिए, यह एक विकल्प नहीं है। वास्तविक स्क्रिप्ट को विभिन्न संस्करणों के एकाधिक AIX और Solaris सर्वर पर चलने की आवश्यकता है। कुछ में ksh93 है, लेकिन अधिकांश में केवल ksh88 है। –
@ एड्रियनफ्रुहर्थ - '$ {var}' echo 'echo "$ {var}" उपरोक्त सभी मामलों में समान परिणाम उत्पन्न करें। यदि आप xtrace '#!/Bin/ksh -x' को सक्षम करते हैं तो आप प्रदर्शित होने से पहले 'var' के मान को देख सकते हैं। मॉडल प्रश्न के लिए –