2009-12-01 18 views
16

में डबल-उद्धृत स्ट्रिंग में बैकक्वॉइट से बचें आदेश के लिए:/usr/bin/sh -c "ls 1`" (1 के बाद बैकक्वॉट)।खोल

इसे सफलतापूर्वक कैसे चलाया जाए? "` "काम करने से पहले बैकस्लैश जोड़ना काम नहीं करता है। 'जैसा कि हम जानते हैं, एक विशेष char है, और मैंने इसे एकल कोट के साथ भी कोशिश की (/ usr/bin/sh -c "ls 1'`'"), लेकिन यह या तो काम नहीं करता है।

हमेशा त्रुटि हैं:

% /usr/bin/sh -c "ls 1\`" 
Unmatched ` 
+0

क्या आपके पास एक बैकटिक है? '1 \' 'एक फ़ाइल नाम है? –

+0

हां, असल में मैं कमांड "टच 1'" जारी करके "1'" नाम की एक फाइल बना सकता हूं, लेकिन खोल सिर्फ डबल कोट्स के अंदर पार्स नहीं कर सकता –

उत्तर

1

उपयोग एकल बजाय उद्धरण:

 
$ touch 1\` 
$ /bin/sh -c "ls 1\\\`" 
1` 

कारण:

/usr/bin/sh -c 'ls 1\`' 
33

आप बैकटिक से बचने के लिए, लेकिन यह भी बैकस्लैश से बचने की जरूरत है आपको इसे "दो बार" से बचाना है क्योंकि आप इस कमांड को पर्यावरण में दर्ज कर रहे हैं (जैसे शेल स्क्रिप्ट) था टी एक बार डबल उद्धृत स्ट्रिंग का अर्थ है। फिर इसे सबहेल द्वारा फिर से व्याख्या किया जाता है।

तुम भी डबल उद्धरण से बच सकते हैं, और इस तरह पहली व्याख्या से बचने:

 
$ /bin/sh -c 'ls 1\`' 
1` 

एक और तरीका है एक चर में फ़ाइल नाम स्टोर करने के लिए, और प्रयोग है कि मूल्य है:

 
$ export F='1`' 
$ printenv F 
1` 
$ /bin/sh -c 'ls $F' # note that /bin/sh interprets $F, not my current shell 
1` 

और आखिरकार, आपने जो कुछ भी किया है, वह कुछ गोले पर काम करेगा (मैं उपरोक्त उदाहरणों के लिए बैश का उपयोग कर रहा हूं), जाहिर है कि आपके खोल के साथ नहीं:

 
$ /bin/sh -c "ls 1'\`'" 
1` 
$ csh # enter csh, the next line is executed in that environment 
% /bin/sh -c "ls 1'\`'" 
Unmatched `. 

मैं दृढ़ता से सुझाव देता हूं कि आप first place में ऐसे फ़ाइल नामों से बचें।