2012-03-01 14 views
11

मैं एक bash स्क्रिप्ट के भीतर कठिनाई नेस्ट उद्धरण हो रही हैबैश नेस्ट उद्धरण और eval

argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 
eval $argv 

ऊपर मुझे

eval: line 162: unexpected EOF while looking for matching `'' 
eval: line 163: syntax error: unexpected end of file 

उत्तर

12
argv="su -c \"$RVM_PATH wrapper $config_rvm \\\"$PASSENGER_RVM_BIN $command $options\\\"\" web" 
6

Use an array instead.

#!/bin/bash 
cmd=(echo "foo bar") 
"${cmd[@]}" 
+0

मुझे यकीन नहीं है कि आपके द्वारा प्रदान किया गया लिंक बैश सरणी के आपके सुझाए गए उपयोग पर चर्चा करता है। –

+0

@ टोमहेले: मेरे उत्तर में एक वाक्यविन्यास बग था। –

9

है कि मिल गया है क्योंकि \' नहीं करता ' एक एकल उद्धृत स्ट्रिंग के भीतर कोई विशेष अर्थ नहीं है; इसका मतलब है "बैकस्लैश, एंड-स्ट्रिंग के बाद"।

एक विकल्प 'के बजाय $'...' का उपयोग करना है; जो आपको बैकस्लैश-एस्केप का उपयोग करने देगा। यह इस तरह दिखेगा:

argv="su -c $'$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 

नकारात्मक पक्ष यह है कि क्या कोई संभावना है कि $RVM_PATH, $config_rvm, या अन्य चर के किसी भी एक बैकस्लैश शामिल हो सकते हैं अगर है, तो यह भी एक बैकस्लैश-भागने शुरू करने के रूप में व्याख्या की जा सकती है।

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