मैं समझता हूं कि ब्रेस का विस्तार क्या है, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे करना है।
आप इसका उपयोग कब करते हैं?
अगर आपके पास अपनी टिप हो तो कृपया मुझे कुछ सुविधाजनक और उल्लेखनीय उदाहरण सिखाएँ।
मैं समझता हूं कि ब्रेस का विस्तार क्या है, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे करना है।
आप इसका उपयोग कब करते हैं?
अगर आपके पास अपनी टिप हो तो कृपया मुझे कुछ सुविधाजनक और उल्लेखनीय उदाहरण सिखाएँ।
जवाबों:
यदि आपके पास लंबे पथ के नाम हैं, तो ब्रेस विस्तार बहुत उपयोगी है। मैं इसे एक फ़ाइल बैकअप के लिए एक त्वरित तरीके के रूप में उपयोग करता हूं :
cp /a/really/long/path/to/some/file.txt{,.bak}
कॉपी करेंगे /a/really/long/path/to/some/file.txtकरने के लिए/a/really/long/path/to/some/file.txt.bak
आप इसे एक क्रम में भी इस्तेमाल कर सकते हैं । मैंने एक बार वेब से बहुत सारे पृष्ठ डाउनलोड करने के लिए ऐसा किया था:
wget http://domain.com/book/page{1..5}.html
या
for i in {1..100}
do
#do something 100 times
done
programजाता है क्योंकि तीन शब्द हो जाते हैं:, "-f file1" "-f file2" "-f file3"6 के बजाय "-f" "file1" "-f" "file2" "-f" "file3":।
forलूप में उपयोग के लिए विस्तार का उपयोग करना थोड़ा व्यर्थ है, क्योंकि आप लिख सकते हैं for ((i=1; i<=100; i++))और यह अधिक कुशल है।
बड़ी निर्देशिका संरचना बनाते समय ब्रेस विस्तार बहुत काम आता है:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
यह आपको देगा
find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2
आप एक कदम आगे भी जा सकते हैं और ब्रेस विस्तार को ब्रेस विस्तार में डाल सकते हैं:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
यह आपको ऊपर दिए गए उदाहरण के समान निर्देशिका संरचना देगा।
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) वास्तव में किसी भी उद्देश्य की पूर्ति नहीं करता है। आप बस यही कर सकते थे mkdir -p dir1/subdir{1,2}/subsubdir{1,2}:।
subdir1और subdir2गैर-शाब्दिक अर्थों में , तो यह एक उद्देश्य पूरा करता है। उदाहरण के subdir1साथ catऔर उसके subdir2साथ बदलें dog।
मैं इसका उपयोग वास्तविक परीक्षण आउटपुट की तुलना विकास के दौरान वांछित परीक्षण आउटपुट से करने के लिए करता हूं। यदि परीक्षण # 41 विफल हो जाता है, तो यह देखना आसान है कि परीक्षण आउटपुट (फ़ाइल परीक्षण.आउटपुट / 041) और वांछित आउटपुट के बीच अंतर क्या है (फ़ाइल test.out / 041 में):
$ diff tests.{out,output}/041
मेरे लिए कुछ लगातार मामले हैं:
नाम बदलने के लिए:
mv myText.{txt,tex}
या
mv myText.tex{,.old}
या
cp myText.tex{,.backup}
(हालांकि पिछले 2 कार्यों के लिए संस्करण नियंत्रण का उपयोग करना कम गन्दा है।)
तुलना करने के लिए (पहले से ही उल्लेख किया गया है):
diff path{1,2}/a.txt
यहाँ कई शानदार उत्तर हैं, लेकिन ब्रेस विस्तार का उपयोग नहीं करने के लिए उनमें से कोई भी उल्लेख नहीं करता है। अन्य उत्तरदाताओं की तरह, मैं कमांड लाइन पर ब्रेस विस्तार का काफी उपयोग करता हूं। मैं अपने उपनामों और कार्यों में भी इसका उपयोग करता हूं क्योंकि मैं एक स्मार्ट शेल की उम्मीद कर सकता हूं।
मैं अपनी शेल स्क्रिप्ट में इसका उपयोग नहीं करता हूं (जब तक कि कुछ अन्य कारणों से स्क्रिप्ट को बैश या zsh नहीं होना चाहिए, हालांकि उन मामलों में, यह "वास्तविक" स्क्रिप्टिंग भाषा जैसे perlया के लिए अपग्रेड करना सबसे अच्छा है python)। ब्रेस का विस्तार पोर्टेबल नहीं है क्योंकि यह POSIX शेल मानक में नहीं है। यहां तक कि अगर यह अपने में काम करता है /bin/sh- कुटिया एड शेल स्क्रिप्ट, यह अधिक छीन साथ सिस्टम पर काम नहीं करेगा /bin/shगोले (जैसे dash)।
एकल अंक के अंतर के मामले में, आपको ब्रेस विस्तार की आवश्यकता नहीं है; एक चरित्र वर्ग पर्याप्त होगा:
Bashism:
diff file{1,2}
पोर्टेबल:
diff file[12]
file{1,2}हमेशा विस्तार होगा file1 file2, जबकि file[12]केवल मौजूदा फाइलनामों तक फैलता है: यानी यदि file1मौजूद है, लेकिन केवल विस्तार file2नहीं करता है । विस्तार वास्तव में की एक सीमित संस्करण है विस्तार (और वे "पथ विस्तार" कहा जाता है)। file[12]file1[]?
program -f file1 -f file2 -f file3, आप कर सकते हैंprogram "-f file"{1..3}