2010-04-28 14 views
15

क्या कोई ऐसा आदेश है जो न केवल यह तर्क देता है बल्कि यदि आवश्यक हो तो भी उन्हें बच निकलता है (उदाहरण के लिए यदि किसी तर्क में सफेद स्थान या विशेष वर्ण होता है)?गूंज कि ​​शैल-एस्केप तर्क

मुझे इसे कुछ शैल जादू में चाहिए जहां एक स्क्रिप्ट में कमांड निष्पादित करने की बजाय मैं कमांड को प्रतिबिंबित करता हूं। यह आउटपुट एक पायथन स्क्रिप्ट पर पाइप हो जाता है जो आखिरकार कमांड को अधिक कुशल तरीके से निष्पादित करता है (यह वास्तविक लक्ष्य पायथन स्क्रिप्ट की मुख्य() विधि को लोड करता है और इसे दिए गए तर्कों के साथ निष्पादित करता है और चुड़ैल गणना डेटा द्वारा अतिरिक्त पैरामीटर कैश किया जाता है मुख्य()) के रन।

इसके बजाए मैं निश्चित रूप से सभी शैल जादू को पाइथन पर बंद कर सकता हूं जहां मुझे कुछ भी पाइप करने की आवश्यकता नहीं होगी।

उत्तर

23

बैश के साथ, printf निर्मित एक अतिरिक्त फॉर्मेट स्पेसिफायर %q है, जो एक अनुकूल तरीके से इसी तर्क प्रिंट है:

मानक printf के अलावा (1) स्वरूप, %b कारणों बैकस्लैश विस्तार करने के लिए printf इसी तर्क में दृश्यों से बचने के (कि \c छोड़कर उत्पादन, \' के बैकस्लैश, \" समाप्त हो जाता है, और \? नहीं हटाया जाता है, और अष्टाधारी पलायन \0 के साथ शुरुआत करने के लिए चार अंक हो सकती है), और %q कारणों उत्पादन करने के लिए इसी argumen printf एक प्रारूप में टी जिसे खोल इनपुट के रूप में पुन: उपयोग किया जा सकता है।

तो तुम कुछ इस तरह कर सकते हैं:

printf %q "$VARIABLE" 
printf %q "$(my_command)" 

एक चर या एक प्रारूप है जो फिर से इनपुट के रूप में में पारित करने के लिए सुरक्षित है में एक कमांड के आउटपुट की सामग्री (अर्थात रिक्त स्थान से बच गया) प्राप्त करने के लिए। उदाहरण के लिए:

$ printf "%q\n" "foo bar" 
foo\ bar 

(मैं एक नई पंक्ति सिर्फ इसलिए यह एक इंटरैक्टिव खोल में सुंदर हो जाएगा जोड़ा।)

+1

धन्यवाद, मैं उस के बारे में पता नहीं था। यदि आप zsh का उपयोग करते हैं, तो आप 'q' संशोधक का उपयोग भी कर सकते हैं: '$ {(q) VAR}' एक ही तरीके से चर से बच निकलता है। – ZyX

+0

धन्यवाद, लेकिन printf का उपयोग करके मुझे पहले से ही तर्कों की संख्या जाननी होगी। खैर मुझे लगता है कि मुझे कुछ पता चला है। – panzi

+2

एर, क्या कोई कारण है कि आप 'arg में "$ @" जैसे कुछ नहीं कर सकते हैं; printf% q "$ arg" करें; done'? – Cascabel

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