আমি জিজ্ঞাসা করতে চাই:
কেন 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