क्यों "बिल्ली {फू}" आउटपुट फू नहीं करता है, लेकिन "बिल्ली {फू, बार}" करता है?


12

मैं उप-फ़ोल्डर्स में पाठ फ़ाइलों को संक्षिप्त करने की कोशिश कर रहा था और कोशिश की:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

हालांकि यह कुछ भी वापस नहीं आया। इसलिए, एक गैर मौजूदा 'सबफ़ोल्डर 2' जोड़ने की कोशिश की

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

और इस बार इसने काम किया, फाइलों को सफलतापूर्वक संकलित करना। ऐसा क्यों होता है?


2
का प्रयोग करें echoबजाय catदेखने के लिए कमांड लाइन आप मिल गया। (या set -xडिबगिंग के लिए उपयोग करें ।)
पीटर कॉर्ड्स

जवाबों:


22

परिभाषा के अनुसार, GNU बैश में ब्रेस विस्तार के लिए या तो एक अनुक्रम अभिव्यक्ति की आवश्यकता होती है या अल्पविराम द्वारा अलग किए गए मानों की एक श्रृंखला होती है:

ब्रेस विस्तारित किए जाने वाले पैटर्न एक वैकल्पिक प्रस्तावना का रूप लेते हैं, इसके बाद कॉमा-अलग स्ट्रिंग्स की एक श्रृंखला या ब्रेसिज़ की एक जोड़ी के बीच अनुक्रम अभिव्यक्ति, एक वैकल्पिक पोस्टस्क्रिप्ट के बाद होती है।

आप विवरण के लिए मैनुअल पढ़ सकते हैं

कुछ सरल नमूने:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2

21

{subfolder1}का मूल्यांकन करता है {subfolder1}, क्योंकि कोई विकल्प नहीं हैं। subfolder1इसके बजाय उपयोग करें ।


2
ध्यान दें कि यह csh(जहां ब्रेस विस्तार से आता है), tcshया से अलग है fish
स्टीफन चेजेलस

1

ब्रेसेस का केवल तभी विस्तार होगा जब उनके पास कोमा अलग तार हो, उदाहरण के लिए {abc, def} या रेंज, उदाहरण के लिए {a..e} उनके बीच निर्दिष्ट।

अपने मामले में आप बस सबफ़ोल्डर 1 को ब्रेसिज़ में संलग्न किए बिना लिख ​​सकते हैं क्योंकि इसके लिए कोई आवश्यकता नहीं है

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

दुर्भाग्य से, दो तारों का /path/{a,}/filenameविस्तार होता है और , जो अवांछित हो सकता है। /path/a/filename/path//filename
Kusalananda

धन्यवाद @Kusalananda मुझे सुधारने के लिए, हाँ बैश एक चेतावनी प्रदान करेगा "अस्पष्ट पुनर्निर्देशन"
Neo_Returns

नहीं, आप प्राप्त करते हैं, ambiguous redirect तो आप एक ऐसे फ़ाइल को पुनर्निर्देशित करने का प्रयास करते हैं, जो बिना मूल्य वाले किसी चर द्वारा दिया गया है, जिसका कोई मूल्य नहीं है, जैसे echo 'hello' >$idontexist
Kusalananda

1
... या यदि पुनर्निर्देशन में फ़ाइल नाम का विस्तार कई शब्दों में हो जाता है। जैसा > *.txtकई के साथ .txtफ़ाइलें, या > $fileयदि $fileरिक्त स्थान हैं। लेकिन निश्चित रूप से catकई तर्क देने में कुछ भी अस्पष्ट नहीं है
ilkkachu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.