ब्रेस विस्तार: एक लाइन पर विस्तार करने के बजाय कई कमांड चलाएं?


11

जब आप बश में ब्रेस विस्तार का उपयोग करते हैं, तो कुछ ऐसा होता है

echo {a,b,c}

हो जाता है

echo a b c

क्या इसके लिए 3 अलग-अलग कमांड का विस्तार करने का एक तरीका है, प्रत्येक विस्तार के लिए एक, इसके बजाय?

इसलिए कि:

echo {a,b,c}

बन जाएगा

echo a
echo b
echo c

जवाबों:


12

क्या यह सिर्फ एक "क्योंकि मैं जानना चाहता हूं" सवाल है, या क्या इसके लिए एक वास्तविक उपयोग मामला है? हम इसे प्राप्त करने के लिए कुछ जिम्नास्टिक के माध्यम से जा सकते हैं:

$ eval echo\ {a,b,c}\;
a
b
c

लेकिन मैं किसी को भी शिकार करूँगा जो हमारे सिस्टम स्क्रिप्ट में इस प्रकार के ओफ़्फ़ुसेटरी कमांड में डाल रहा है।

इसके बजाय स्पष्टता के लिए क्यों न जाएं:

$ for X in {a,b,c}; do echo $X; done

आप पूरे हॉग में भी जा सकते हैं और एक नई सूची में डाल सकते हैं और इसे थोड़ा सा प्रेरित कर सकते हैं ताकि आप हमेशा समझ सकें कि आप क्या करने की कोशिश कर रहे थे।


4
@peth - मैं मान रहा हूं कि यह एक सरल उदाहरण है। यदि यह वास्तव में एक सूची के रूप में सरल है, तो आप सही हैं। यदि यह कुछ अधिक पसंद है, file-{r,b,g}{m,n,o}{x,y.z}.fooतो सभी 27 मानों की गणना करने की तुलना में संक्षिप्त रूप का उपयोग करना बेहतर है।
अनहथोनिक

@peth - मैंने सोचा कि यह एक अच्छा अनुवर्ती प्रश्न था।
बेफिक्रे

मैं एक लंबे समय के लिए यह जानना चाहता था, धन्यवाद! :)
१३:०१ पर साइरेक्स

1
खैर, उपयोग मामला ऐसे प्रोग्राम थे जो एक से अधिक फ़ाइल (उदाहरण के लिए) को स्वीकार नहीं करते हैं, इसलिए जहां विस्तार काम नहीं करेगा। इसलिए, कई बार प्रोग्राम को आसानी से चलाने में आसानी होगी। इसके लिए forकाम करता है, लेकिन यह अभी भी अधिक टाइपिंग है: पी
houbysoft

मैंने इसका उपयोग कई गिट शाखाओं को साफ करने के लिए किया:eval git branch -d \{ branch-a, branch-b }\;
किट

3

मार्क मान के चयनित जवाब के आधार पर , मैं इस उदाहरण को आगे बढ़ाने में सक्षम था, जो बहुत अच्छा काम करता है:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

जो दिखा रहा है, वह यह है कि जब आप एक पंक्ति के भीतर ब्रेस विस्तार की कई घटनाओं का उपयोग कर रहे हैं, तो मार्क का मूल उदाहरण व्यक्तिगत रूप से प्रत्येक भिन्नता को मुद्रित करेगा। इसके बजाय, मैं कई फ़ाइलों को स्थानांतरित / नाम बदलने के लिए उनके उत्तर का उपयोग करना चाहता था। यह सुनिश्चित करने के लिए कि आउटपुट प्रारूप से मेल खाता है जो mvसामान्य रूप से उम्मीद करता है ( mv oldfilename newfilename), मैं ब्रेस विस्तार की दूसरी घटना से बच गया, ताकि प्रारंभिक कमांड निष्पादित होने के बाद तक इसका मूल्यांकन नहीं किया जा सके eval

जैसा कि उपरोक्त आउटपुट उम्मीद के अनुसार दिखाई दिया, तब मैं निम्नलिखित कमांड चलाने में सक्षम था:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

उनके मूल उत्तर के लिए मार्क को बहुत धन्यवाद। कृपया उसके उत्तर को वोट करें यदि आप पसंद करते हैं तो उसका उत्तर मुझे क्या करने की अनुमति देता है :-)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.