`A [bc] d` (বন্ধনী) এবং` a {b, c} d` (ধনুর্বন্ধনী) এর মধ্যে পার্থক্য কী?


28

মধ্যে পার্থক্য কি a[bc]dএবং a{b,c}d? লোকেরা কেন a{b,c}dআগে থেকেই ব্যবহার করবে a[bc]d?


কে আপনাকে ব্যবহার করতে বলেছিল command a[bc]d?
জেসি_বি

3
যদি কেউ এটি সঠিকভাবে বুঝতে পারে তবে এর অবশ্যই ব্যবহার রয়েছে।
ওয়েইজুন চিউ

7
আমার ধারণা আমি দু'জনের মধ্যে যে বিভ্রান্তি ঘটেছিল তা ঠিক বুঝতে পারছি না।
জেসি_বি

আমাকে সম্প্রতি লিনাক্সের সাথে কম পরিচিত কোনও সহকর্মী দ্বারা স্পষ্টভাবে জিজ্ঞাসা করেছিলেন।
ওয়েইজুন চিউ

@ জেসি_বি আপনি যদি কেবলমাত্র তাদের মতো ফাইলগুলিতে অপারেশন দিয়ে চেষ্টা করে থাকেন lsএবং আপনি কেবল কখনও একক অক্ষর ব্যবহার করে থাকেন তবে এগুলি একই কাজ করতে দেখা যাবে।
নচট - মনিকা পুনরায়

উত্তর:


43

দুটি বেশ আলাদা।

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কিছু পুরানো সংস্করণ এবং যদি একই কমান্ডে অন্য কোনও ম্যাচিং গ্লোব থাকে)।fishsh(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}কোনও সমস্যা কম।


"যদি আবদ উপস্থিত থাকে তবে এসিড না থাকলে তা কেবল আবদারে প্রসারিত হবে" স্পষ্ট করার জন্য আপনাকে ধন্যবাদ। আমার ধারণাটি আমার উত্তর থেকে অনুপস্থিত।
ওয়েইজুন চিউ

9
আর একটি গুরুত্বপূর্ণ পার্থক্য হ'ল a{b,c}dএতে bএবং cঅংশগুলিকে একক বর্ণের প্রয়োজন হয় না; যেমন ex{ten,ci}sion। যখন ex[tenci]sionবা যা কিছু কেবল এই বর্ণগুলির সাথে মেলে one
অ্যালেক্সিস

7

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}যা কেবলমাত্র bash3.0 এর পরে উপস্থিত হয়েছিল এবং bash4.0-এ আরও যুক্ত হয়েছে ।

একটি শেল যেখানে গ্লোববিং চালু আছে, একটি খালি ফোল্ডারে চালিত করুন, নিম্নলিখিত ফলাফলটি ফিরে আসবে

$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd

@ জেসি_বি'র মন্তব্যের জবাবে, আপনি যদি ইন্টারেক্টিভ শেলটিতে থাকেন এবং উভয়ই প্রয়োগ করেন তবে a[bc]dটাইপ করতে সমস্যা কম হয়। উদাহরণস্বরূপ grep pattern [ab][12].txt


2
ধনুর্বন্ধনী সম্প্রসারণ একটি "বাশিজম" নয়; এটি প্রথম হাজির হয়েছিল csh, অনেক আগে bash। এটি গ্লোব (3) লাইব্রেরি ফাংশনে উপস্থিত রয়েছে। পার্থক্যটি হ'ল এটি bashঅন্যান্য বিস্তারের আগে সম্পাদিত হয়: a=A; ab=A/B; ac=A/C; echo $a{b,c}অন্য কোনও শেল থেকে বাশে আলাদাভাবে কাজ করবে।
মশবির

ধন্যবাদ. আমি উত্তর আপডেট করব।
ওয়েইজুন চিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.