মধ্যে পার্থক্য কি a[bc]d
এবং a{b,c}d
? লোকেরা কেন a{b,c}d
আগে থেকেই ব্যবহার করবে a[bc]d
?
ls
এবং আপনি কেবল কখনও একক অক্ষর ব্যবহার করে থাকেন তবে এগুলি একই কাজ করতে দেখা যাবে।
মধ্যে পার্থক্য কি a[bc]d
এবং a{b,c}d
? লোকেরা কেন a{b,c}d
আগে থেকেই ব্যবহার করবে a[bc]d
?
ls
এবং আপনি কেবল কখনও একক অক্ষর ব্যবহার করে থাকেন তবে এগুলি একই কাজ করতে দেখা যাবে।
উত্তর:
দুটি বেশ আলাদা।
a[bc]d
একটি ফাইল নাম প্যাটার্ন (শেল ছাড়া অন্য fish
)। এটি দুটি ফাইলের নাম abd
এবং acd
যদি বর্তমান ডিরেক্টরিতে বিদ্যমান ফাইলগুলির নাম হয় তবে এটি প্রসারিত হবে ।
[...]
অংশ বন্ধনী করা অভিব্যক্তি তালিকাভুক্ত (অথবা যখন রেঞ্জ অন্তর্ভুক্ত করা হয় উপাদান ক্রমানুসারে সাজানো) বেশী থেকে একটি একক অক্ষর মিলে যায় হয়। প্যাটার্নটি মেলানোর জন্য a[bc]d
, স্ট্রিংগুলির মধ্যে a
এবং d
কোনও ফাইলনামের মধ্যে অক্ষরটি একটি b
বা একটি হতে হবে c
।
যদি abd
বিদ্যমান থাকে তবে acd
তা না থাকলে তা কেবল প্রসারিত হবে abd
এবং বিপরীতে।
তাহলে তন্ন তন্ন abd
, কিংবা acd
বিদ্যমান, শেল এবং বিকল্প উপর নির্ভর করে, একটি ত্রুটি (মূল ইউনিক্স আরম্ভ হবে sh
, (t)csh
, zsh
, fish
, bash -O failglob
) এবং সম্ভবত শেল থেকে প্রস্থান, বা প্যাটার্ন unexpanded¹ ছেড়ে (বোর্ন মত এবং rc
-একটি শাঁস) অথবা প্রসারিত কিছুই নয়, ( মূল ইউনিক্সের bash/zsh/yash -o nullglob
কিছু পুরানো সংস্করণ এবং যদি একই কমান্ডে অন্য কোনও ম্যাচিং গ্লোব থাকে)।fish
sh
(t)csh
a{b,c}d
হ'ল একটি ধনুর্বন্ধনী সম্প্রসারণ (শেলগুলিতে যা এগুলিকে সমর্থন করে)। এটি দুটি স্ট্রিং পর্যন্ত প্রসারিত হবে abd
এবং acd
।
{...}
অংশ স্ট্রিং একটি কমা দ্বারা আলাদা করা সেট (এই উদাহরণে; কিছু শেল, এটি যেমন একটি সীমার হতে পারে a..k
বা 20..25
বা আরো উন্নত মত বেশী 00..20..2
বা 0..20..2%02d
), এবং সম্প্রসারণ পার্শ্বস্থগুলি সঙ্গে এই স্ট্রিং প্রতিটি মিশ্রন দ্বারা নির্ণয় করা হয় স্ট্রিং a
এবং d
। এই স্ট্রিংগুলি একটি একক চরিত্রের চেয়ে দীর্ঘ হতে পারে এবং এগুলি ব্রেস সম্প্রসারণও হতে পারে।
এই স্ট্রিংগুলি বিদ্যমান ফাইলের সাথে মিল রয়েছে কিনা তা নির্বিশেষে সম্প্রসারণ ঘটে।
আপনি যদি স্ট্রিং তৈরি করে থাকেন তবে একটি ব্রেস এক্সপেনশন ব্যবহার করুন। আপনি যদি ফাইলের সাথে মেলে, একটি ফাইলের নাম ধরণ ব্যবহার করুন।
Particular এই বিশেষ ক্ষেত্রে, a[bc]d
একটি বিদ্যমান ফাইলের নাম হতে পারে যার কারণে rm -f ./*.[ch]
এই শেলগুলির মতো জিনিসগুলি ব্যবহার করা সম্ভাব্য বিপজ্জনক এবং rm -f ./*.{c,h}
কোনও সমস্যা কম।
a{b,c}d
এতে b
এবং c
অংশগুলিকে একক বর্ণের প্রয়োজন হয় না; যেমন ex{ten,ci}sion
। যখন ex[tenci]sion
বা যা কিছু কেবল এই বর্ণগুলির সাথে মেলে one
a[bc]d
হয় প্যাটার্ন-তুল্য , এবং POSIX মান অংশ। পসিক্সে, এটি "প্যাটার্ন ব্র্যাকেট এক্সপ্রেশন" হিসাবে পরিচিত হয়। এটি ম্যানুয়ালটির 2.13 বিভাগে নথিভুক্ত করা হয়েছে
যখন উদ্ধৃত এবং বন্ধনী বন্ধনের বাইরে, নিম্নলিখিত তিনটি অক্ষরের নিদর্শনগুলির নির্দিষ্টকরণের বিশেষ অর্থ থাকবে:
?
একটি প্রশ্ন-চিহ্ন এমন একটি প্যাটার্ন যা কোনও চরিত্রের সাথে মেলে match
*অ্যাসিরিস্টক এমন একটি প্যাটার্ন যা একাধিক অক্ষরের সাথে মেলে, যেমন একাধিক অক্ষরের সাথে মেটাতে প্যাটার্নস বর্ণিত।
[খোলা বন্ধনী একটি প্যাটার্ন বন্ধনী এক্সপ্রেশন পরিচয় করিয়ে দেবে।
বিভাগ ২.১.3.৩ এ এমন কিছু বিষয়ও উল্লেখ করেছে যা ফাইল নাম প্রসারণের জন্য ব্যবহৃত হয় যখন এটি স্বাভাবিক রেজেসের জন্য প্রত্যাশা করে তার থেকে আলাদাভাবে আচরণ করে (আমার দ্বারা জোর দেওয়া)
একক অক্ষর এবং প্যাটার্নগুলি মিলিয়ে একাধিক অক্ষরের সাথে মিল রেখে প্যাটার্নগুলিতে এখনও অবধি বর্ণিত নিয়মগুলি নীচের নিয়মগুলির দ্বারা যোগ্য হয় যা প্রয়োগ হয় যখন ফাইলের নাম প্রসারের জন্য প্যাটার্ন ম্যাচিং নোটেশন ব্যবহার করা হয়:
কোনও প্যাথনামের স্ল্যাশ বর্ণচিহ্নটিতে এক বা একাধিক স্ল্যাশ ব্যবহার করে স্পষ্টতই মিলবে; এটি না খালি বা প্রশ্ন চিহ্ন বিশেষ অক্ষর বা বন্ধনী এক্সপ্রেশন দ্বারা মেলে না। বন্ধনী প্রকাশের আগে প্যাটার্নে স্ল্যাশগুলি চিহ্নিত করা হবে; সুতরাং, ফাইলের নাম প্রসারণের জন্য ব্যবহৃত একটি প্যাটার্ন বন্ধনী এক্সপ্রেশনটিতে স্ল্যাশ অন্তর্ভুক্ত করা যাবে না। যদি কোনও সমাপ্ত বর্গাকার বন্ধনীর সন্ধানের আগে একটি অনস্কেপড ওপেন স্কোয়ার ব্র্যাকেট অক্ষর অনুসরণ করে একটি স্ল্যাশ অক্ষর পাওয়া যায়, উন্মুক্ত বন্ধনীটিকে একটি সাধারণ চরিত্র হিসাবে বিবেচনা করা হবে। উদাহরণ হিসেবে বলা যায়, প্যাটার্ন
"a[b/c]d"
হিসাবে যেমন pathnames মিলছে নাabd
বাa/d
। এটি কেবল আক্ষরিক একটি পথের সাথে মেলেa[b/c]d
।
a{b,c}d
হ'ল ধনুর্বন্ধনী সম্প্রসারণ , এটি পসিক্স দ্বারা নির্দিষ্টকরণে নয়। এখানে বাশ ম্যানুয়াল থেকে সংশ্লিষ্ট অংশটি দেওয়া হয়েছে (আমার দ্বারা জোর দেওয়া):
ব্রেস এক্সপেনশন এমন একটি প্রক্রিয়া যার মাধ্যমে স্বেচ্ছাসেবী স্ট্রিংগুলি উত্পন্ন করা যেতে পারে। এই প্রক্রিয়াটি ফাইল নাম সম্প্রসারণের (ফাইলের নাম সম্প্রসারণ দেখুন) অনুরূপ , তবে উত্পন্ন ফাইলের নামগুলির প্রয়োজন নেই । ধনুর্বন্ধনী প্রসারিত করতে প্যাটার্নগুলি alচ্ছিক উপস্থাপকের আকার ধারণ করে , পরে কমা-বিচ্ছিন্ন স্ট্রিংগুলির একটি সিরিজ বা একটি ধনুর্বন্ধনী জোড়ের মধ্যে ক্রম প্রকাশ, পরে একটি an চ্ছিক পোস্টস্ক্রিপ্ট হয়। ধনুর্বন্ধনী মধ্যে থাকা প্রতিটি স্ট্রিংয়ের জন্য উপস্থাপিকা উপস্থাপিত হয় এবং পোস্টস্ক্রিপ্টটি প্রতিটি ফলিত স্ট্রিংয়ে বাম থেকে ডানদিকে প্রসারিত হয়।
@ মোসভির মন্তব্য অনুসারে, এটি প্রথমে উপস্থিত হয়েছিল csh
তবে এর আচরণ অন্য শেল bash
থেকে আলাদা csh
। এই ধরণের ধনুর্বন্ধনী সম্প্রসারণ এছাড়াও উপস্থিত glob(3)
।
এখানে অন্য ধরণের ধনুর্বন্ধনী সম্প্রসারণ রয়েছে {a..z}
যা কেবলমাত্র bash
3.0 এর পরে উপস্থিত হয়েছিল এবং bash
4.0-এ আরও যুক্ত হয়েছে ।
একটি শেল যেখানে গ্লোববিং চালু আছে, একটি খালি ফোল্ডারে চালিত করুন, নিম্নলিখিত ফলাফলটি ফিরে আসবে
$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd
@ জেসি_বি'র মন্তব্যের জবাবে, আপনি যদি ইন্টারেক্টিভ শেলটিতে থাকেন এবং উভয়ই প্রয়োগ করেন তবে a[bc]d
টাইপ করতে সমস্যা কম হয়। উদাহরণস্বরূপ grep pattern [ab][12].txt
।
csh
, অনেক আগে bash
। এটি গ্লোব (3) লাইব্রেরি ফাংশনে উপস্থিত রয়েছে। পার্থক্যটি হ'ল এটি bash
অন্যান্য বিস্তারের আগে সম্পাদিত হয়: a=A; ab=A/B; ac=A/C; echo $a{b,c}
অন্য কোনও শেল থেকে বাশে আলাদাভাবে কাজ করবে।
command a[bc]d
?