আমি জিজ্ঞাসা করতে চাই:
কেন echo {1,2,3}1 2 3 এ বিস্তৃত হবে যা প্রত্যাশিত আচরণ, যখন আমি echo [[:digit:]]প্রত্যাবর্তন করি [[:digit:]]যখন এটি সমস্ত অঙ্ক মুদ্রণ করে প্রত্যাশিত 0হয় 9?
আমি জিজ্ঞাসা করতে চাই:
কেন echo {1,2,3}1 2 3 এ বিস্তৃত হবে যা প্রত্যাশিত আচরণ, যখন আমি echo [[:digit:]]প্রত্যাবর্তন করি [[:digit:]]যখন এটি সমস্ত অঙ্ক মুদ্রণ করে প্রত্যাশিত 0হয় 9?
উত্তর:
কারণ এগুলি দুটি ভিন্ন জিনিস। {1,2,3}একটি উদাহরণ বক্রবন্ধনী সম্প্রসারণ । {1,2,3}কনস্ট্রাক্ট সম্প্রসারিত হয় শেল দ্বারা , আগে echoএমনকি এটি সূচিত করা হবে। আপনি যদি ব্যবহার করেন তবে কী ঘটে তা আপনি দেখতে পারেন set -x:
$ set -x
$ echo {1,2,3}
+ echo 1 2 3
1 2 3
আপনি দেখতে পাচ্ছেন, কমান্ডটি এতে echo {1,2,3}প্রসারিত হয়েছে:
echo 1 2 3
যাইহোক, [[:digit:]]একটি হল POSIX চরিত্র শ্রেণী । আপনি এটি দেওয়ার echoপরে শেলটিও প্রথমে এটি প্রক্রিয়া করে তবে এবার এটি শেল গ্লোব হিসাবে প্রক্রিয়া করা হচ্ছে । এটি একইভাবে কাজ করে যদি আপনি চালিত হন echo *যা বর্তমান ডিরেক্টরিতে সমস্ত ফাইল মুদ্রণ করবে। তবে [[:digit:]]এটি একটি শেল গ্লোব যা কোনও অঙ্কের সাথে মেলে। এখন ব্যাশে, যদি শেল গ্লোব কোনও কিছুর সাথে মেলে না, তবে এটি নিজের মধ্যে প্রসারিত হবে:
$ echo /this*matches*no*files
+ echo '/this*matches*no*files'
/this*matches*no*files
গ্লোব যদি কোনও কিছুর সাথে মেলে তবে তা মুদ্রিত হবে:
$ echo /e*c
+ echo /etc
/etc
উভয় ক্ষেত্রে, echoশেলটি মুদ্রণের জন্য যা কিছু বলে তা কেবল প্রিন্ট করে তবে দ্বিতীয় ক্ষেত্রে, যেহেতু গ্লোব কোনও কিছুর সাথে মেলে ( /etc) এটি কিছু মুদ্রণ করতে বলা হয়।
সুতরাং, যেহেতু আপনার কাছে এমন কোনও ফাইল বা ডিরেক্টরি নেই যাঁর নামটি হুবহু এক অঙ্ক নিয়ে গঠিত (যা এটি [[:digit:]]মিলবে), তাই গ্লোবটি নিজের মধ্যে প্রসারিত হয় এবং আপনি পান:
$ echo [[:digit:]]
[[:digit:]]
এখন, একটি ফাইল বলা 5এবং একই কমান্ড চালানোর চেষ্টা করুন :
$ echo [[:digit:]]
5
এবং যদি একের অধিক মেলানো ফাইল থাকে:
$ touch 1 5
$ echo [[:digit:]]
1 5
এটি (সাজানোর) বিকল্পগুলির man bashব্যাখ্যাতে নথিবদ্ধ nullglobযা এই আচরণটি বন্ধ করে দেয়:
nullglob
If set, bash allows patterns which match no files (see
Pathname Expansion above) to expand to a null string,
rather than themselves.
আপনি যদি এই বিকল্পটি সেট করেন:
$ rm 1 5
$ shopt -s nullglob
$ echo [[:digit:]] ## prints nothing
$
shopt -s failglobমত আধুনিক শাঁস অনুরূপ আরো একটি দরকারী আচরণ পেতে zshবা fish।
failglob। nullglobযখন একটি URL রয়েছে যা একটি আছে ঘটবে পেস্ট অপ্রত্যাশিত বিষয়, যেমন সৃষ্টি করতে পারে ?।
nullglobএটি দেখানোর জন্য উল্লেখ করেছি যে প্যাটার্নটি শেল দ্বারা একটি গ্লোব হিসাবে ব্যাখ্যা করা হচ্ছে।
{1,2,3}এটি হ'ল ধনুর্বন্ধনী প্রসার , এটি তাদের অর্থ বিবেচনা না করে তালিকাভুক্ত শব্দগুলিতে প্রসারিত হয়।
[...]তারকাচিহ্ন এবং প্রশ্ন চিহ্নের অনুরূপ ফাইল নাম সম্প্রসারণ (বা ওয়াইল্ডকার্ড, বা গ্লোব) তে ব্যবহৃত একটি অক্ষর গোষ্ঠী । এটি এর মধ্যে তালিকাবদ্ধ যে কোনও একক অক্ষরের সাথে বা নামের তালিকাভুক্ত গোষ্ঠীর সদস্যদের এমন অক্ষরগুলির সাথে মেলে যা যেমন তালিকাভুক্ত রয়েছে। বেশিরভাগ শেলের ডিফল্ট আচরণ হ'ল ওয়াইল্ডকার্ডটি যেমন আছে তেমন কোনও মিল নেই তবে leave*?[:digit:]
(নোট করুন যে আপনি সত্যই কোনও ওয়াইল্ডকার্ড / প্যাটার্নটি তার সাথে মেলে তারের সেটে সেট করতে পারবেন না The
তাই:
$ bash -c 'echo [[:digit:]]' # bash leaves it as-is
[[:digit:]]
$ zsh -c 'echo [[:digit:]]' # zsh by default complains if no match
zsh:1: no matches found: [[:digit:]]
$ touch 1 3 d i g t
$ bash -c 'echo [[:digit:]]' # now there are two matches
1 3 # note that d, i, g and t do NOT match
কিন্তু এখনো:
$ bash -c 'echo {1,2,3}'
1 2 3
যারা উভয় শেল দ্বারা প্রসারিত হয় , এটা কোন ব্যাপার না যদি কমান্ড তুমি চলমান ls, বা echoবা rm। আরও মনে রাখবেন যে এগুলির মধ্যে একটির উদ্ধৃতি দেওয়া থাকলে সেগুলি প্রসারিত হবে না:
$ bash -c 'echo "[[:digit:]]"' # even though matching files still exist
[[:digit:]]
$ bash -c 'echo "{1,2,3}"'
{1,2,3}
[[:digit:]] আগে "সম্প্রসারিত" হবে echo, তাই echoকখনও দেখেনি [[:digit:]], এটি কেবল দেখায় 1 3। আপনি এটি চালিয়ে ক্রিয়াতে দেখতে পাচ্ছেন set -xযা চালিত আসল কমান্ডগুলি মুদ্রণ করবে ( set +xএটিকে আবার বন্ধ করার জন্য চালাবে )।
echoফাইলগুলি অনুসন্ধান করে না, শেলটি করে echo।
{1,2,3}(এবং যেমন {1..3}হয় বক্রবন্ধনী প্রসারণও । তারা কমান্ড সঞ্চালনের আগে শেল দ্বারা ব্যাখ্যা করা হয়।
[[:digit:]]টোকেনের সাথে মেলে এমন একটি প্যাটার্ন , তবে আপনি সেই প্যাটার্নের সাথে মেলে এমন কোনও ফাইলের সাথে কোনও অবস্থান ব্যবহার করছেন না। যদি আপনি কোনও প্যাটার্ন ম্যাচ ব্যবহার করেন যা কোনও মিল নেই তবে এটি নিজের মধ্যে প্রসারিত:
$ echo [[:digit:]]; touch 3; echo [[:digit:]]
[[:digit:]]
3