প্রতিধ্বনির সাথে অপ্রত্যাশিত আচরণ [[: অঙ্ক:]]


10

আমি জিজ্ঞাসা করতে চাই:

কেন echo {1,2,3}1 2 3 এ বিস্তৃত হবে যা প্রত্যাশিত আচরণ, যখন আমি echo [[:digit:]]প্রত্যাবর্তন করি [[:digit:]]যখন এটি সমস্ত অঙ্ক মুদ্রণ করে প্রত্যাশিত 0হয় 9?


এর জন্য দেখুন: unix.stackexchange.com/q/347950/117549
জেফ

উত্তর:


34

কারণ এগুলি দুটি ভিন্ন জিনিস। {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

$ 

4
আরও দেখুন shopt -s failglobমত আধুনিক শাঁস অনুরূপ আরো একটি দরকারী আচরণ পেতে zshবা fish
স্টাফেন চেজেলাস

আমি স্টাফেনের সাথে একমত, ব্যবহার failglobnullglobযখন একটি URL রয়েছে যা একটি আছে ঘটবে পেস্ট অপ্রত্যাশিত বিষয়, যেমন সৃষ্টি করতে পারে ?
কেভিন

1
অবশ্যই, আমি কেবল nullglobএটি দেখানোর জন্য উল্লেখ করেছি যে প্যাটার্নটি শেল দ্বারা একটি গ্লোব হিসাবে ব্যাখ্যা করা হচ্ছে।
টেরডন

14

{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}

আপনার উত্তরের জন্য ধন্যবাদ, লিনাক্সে নতুন তাই আমাকে জিজ্ঞাসা করুন যে প্রতিধ্বনি ফাইলগুলি 3 3 এর সাথে কীভাবে সম্পর্কিত, এটি আমার জ্ঞান হিসাবে ফাইলগুলি অনুসন্ধান না করে
স্ট্যান্ডআউটে

1
@ আবদুল্লাহ তালাত এর প্রতিধ্বনি দিয়ে আসলে কিছুই করার নেই। শেলটি (যেমন: বাশ) এটিতে যাওয়ার [[:digit:]] আগে "সম্প্রসারিত" হবে echo, তাই echoকখনও দেখেনি [[:digit:]], এটি কেবল দেখায় 1 3। আপনি এটি চালিয়ে ক্রিয়াতে দেখতে পাচ্ছেন set -xযা চালিত আসল কমান্ডগুলি মুদ্রণ করবে ( set +xএটিকে আবার বন্ধ করার জন্য চালাবে )।
টেরডন

আবদুল্লাহতালাত, চালানোর আগে echoফাইলগুলি অনুসন্ধান করে না, শেলটি করে echo
ilkkachu

বিশেষত যেহেতু আমি ডস / উইন্ডোতে ভাবি ইউটিলিটিগুলি শেল নয়, ওয়াইল্ডকার্ডগুলি প্রসারিত করে। (আমি হয়ত ভুল)
ইলক্কাচু

দুঃখিত বন্ধুরা আমি টেড্রনের উত্তরের সঠিক উত্তর স্থানান্তরিত করেছি কারণ তার মন্তব্যে অর্থটি রয়েছে যে কাজটি প্রতিধ্বনিত হয় না ... তার উত্তরেও সেই অর্থ রয়েছে .. আপনারা সবাই আমাকে সহায়তা করেছিলেন ... আমি চাই যদি আমি রাখতে পারি আপনার সমস্ত উত্তর এবং মন্তব্যের সঠিক উত্তর
আব্দুল্লাহ তালাত

4

{1,2,3}(এবং যেমন {1..3}হয় বক্রবন্ধনী প্রসারণও । তারা কমান্ড সঞ্চালনের আগে শেল দ্বারা ব্যাখ্যা করা হয়।

[[:digit:]]টোকেনের সাথে মেলে এমন একটি প্যাটার্ন , তবে আপনি সেই প্যাটার্নের সাথে মেলে এমন কোনও ফাইলের সাথে কোনও অবস্থান ব্যবহার করছেন না। যদি আপনি কোনও প্যাটার্ন ম্যাচ ব্যবহার করেন যা কোনও মিল নেই তবে এটি নিজের মধ্যে প্রসারিত:

$ echo [[:digit:]]; touch 3; echo [[:digit:]]
[[:digit:]]
3

না, অন্যান্য উত্তরগুলি সঠিকভাবে নির্দেশ করে, প্যাটার্নটি ফাইলের নামের সাথে মেলে।
টবি স্পিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.