শব্দ বিভাজন কি? কেন এটি শেল প্রোগ্রামিংয়ে গুরুত্বপূর্ণ?


16

আমি বিভক্ত হয়ে যাচ্ছি শব্দটির মধ্যে বিভাজনের ভূমিকাটি সম্পর্কে zsh। সি, পাইথন বা ম্যাটল্যাবে প্রোগ্রামিং করার সময় আমি এই ধারণার সংস্পর্শে আসিনি, এবং শব্দের বিভাজন কেন শেল প্রোগ্রামিংয়ের সাথে নির্দিষ্ট কিছু বলে মনে হচ্ছে তা নিয়ে আমার আগ্রহের কারণ হয়ে উঠেছে।

আমি এর আগে এবং অন্যান্য সাইটে শব্দ বিভাজন সম্পর্কে পড়েছি, তবে ধারণাটির স্পষ্ট ব্যাখ্যা খুঁজে পাইনি। উইকিপিডিয়ায় শব্দের বিভাজনের একটি সংজ্ঞা রয়েছে তবে এটি ইউনিক্স শেলের ক্ষেত্রে কীভাবে প্রযোজ্য সে সম্পর্কে কোনও উল্লেখ নেই বলে মনে হয়।

এখানে আমার বিভ্রান্তির উদাহরণ এখানে zsh:

ইন টু Z শেল প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী , আমি নিম্নলিখিত পড়ুন:

৩.১: $varযেখানে var="foo bar"আমি আশা করি তা কেন করবে না?

বেশিরভাগ বোর্ন শেল ডেরিভেটিভগুলিতে, একাধিক-শব্দ ভেরিয়েবল যেমন var="foo bar" কমান্ডে পাস করার সময় বা for foo in $varলুপে ব্যবহৃত হয় তখন শব্দগুলিতে বিভক্ত হয় । ডিফল্টরূপে, zsh এর আচরণ নেই: পরিবর্তনশীল অক্ষত থাকে। (এটি কোনও বাগ নয়! নীচে দেখুন)) SH_WORD_SPLITসামঞ্জস্যতা সরবরাহের জন্য বিকল্পটি বিদ্যমান।

তবে জেড শেল ম্যানুয়ালে আমি নিম্নলিখিতটি পড়ছি:

SH_WORD_SPLIT (-y) <K> <S>

ক্ষেত্র বিভাজনের কারণ থেকে অব্যবহৃত প্যারামিটার বিস্তৃতিতে সম্পাদিত হয়। নোট করুন যে শব্দটি বিভক্তকরণের সাথে এই বিকল্পটির কোনও সম্পর্ক নেই । (প্যারামিটার সম্প্রসারণ দেখুন।)

এটি কেন বলছে যে SH_WORD_SPLITএর শব্দ বিভাজনের সাথে কোনও সম্পর্ক নেই ? এই সমস্ত কি সম্পর্কে শব্দটি স্পষ্টভাবে বিভক্ত হয় না?

উত্তর:


22

প্রারম্ভিক শেলগুলিতে কেবল একটি একক ডেটা টাইপ থাকে: স্ট্রিং। স্ট্রিংগুলির তালিকাগুলি পরিচালনা করার পক্ষে সাধারণ, সাধারণত যখন কোনও প্রোগ্রামে যুক্তি হিসাবে একাধিক ফাইলের নাম পাস করা হয়। বিভাজনের জন্য আর একটি সাধারণ ব্যবহারের ক্ষেত্রে হ'ল কমান্ড ফলাফলের একটি তালিকা আউটপুট করে দেয়: কমান্ডের আউটপুট একটি স্ট্রিং হয়, তবে পছন্দসই ডেটা স্ট্রিংগুলির তালিকা। কোনও ভেরিয়েবলে ফাইলের নামের একটি তালিকা সঞ্চয় করতে, আপনি তাদের মধ্যে ফাঁকা স্থান রাখবেন। তারপরে এটির মতো একটি শেল স্ক্রিপ্ট

files="foo bar qux"
myprogram $files

myprogramতিনটি আর্গুমেন্টের সাহায্যে বলা হয়, শেলটি স্ট্রিংকে $filesশব্দগুলিতে বিভক্ত করে । এ সময় ফাইলের নামের ফাঁকা স্থানগুলি নিষিদ্ধ বা নোট ডোন হিসাবে বিবেচিত হত।

Korn থেকে শেল চালু অ্যারে: আপনি একটি পরিবর্তনশীল মধ্যে স্ট্রিং একটি তালিকা সংরক্ষণ করতে পারে। কর্ন শেলটি তত্কালীন প্রতিষ্ঠিত বোর্ন শেলের সাথে সামঞ্জস্যপূর্ণ ছিল, তাই বেয়ার চলক বিস্তৃতি শব্দ বিভাজনের মধ্য দিয়ে চলেছে এবং অ্যারে ব্যবহার করে কিছু সিনট্যাকটিক ওভারহেডের প্রয়োজন হয় required আপনি উপরে স্নিপেট লিখতে হবে

files=(foo bar qux)
myprogram "${files[@]}"

জেডশ শুরু থেকেই অ্যারে নিয়ে এসেছিলেন এবং এর লেখক পশ্চাদপদ সামঞ্জস্যের ব্যয়ে স্যানার ল্যাঙ্গুয়েজ ডিজাইনের পক্ষে বেছে নিয়েছিলেন। Zsh এ (ডিফল্ট সম্প্রসারণের নিয়মের অধীনে) $varশব্দ বিভাজন সুগন্ধী করে না; আপনি যদি ভেরিয়েবলের শব্দের একটি তালিকা সঞ্চয় করতে চান তবে আপনি একটি অ্যারে ব্যবহার করতে চাইছেন; এবং আপনি যদি সত্যই শব্দ বিভাজন করতে চান তবে আপনি লিখতে পারেন $=var

files=(foo bar qux)
myprogram $files

এই দিনগুলিতে ফাইলের নামের ফাঁকা স্থানগুলি আপনার মুখোমুখি হওয়া দরকার, উভয়ই অনেক ব্যবহারকারী তাদের কাজ করার প্রত্যাশা করে এবং কারণ অনেকগুলি স্ক্রিপ্ট সুরক্ষা-সংবেদনশীল প্রসঙ্গে কার্যকর করা হয় যেখানে আক্রমণকারী ফাইলের নাম নিয়ন্ত্রণ করতে পারে। সুতরাং স্বয়ংক্রিয় শব্দ বিভাজন প্রায়শই একটি উপদ্রব হয়; সুতরাং সর্বদা ডাবল উদ্ধৃতি ব্যবহার করার জন্য আমার সাধারণ পরামর্শ, অর্থাত্ লিখুন "$foo", আপনি যদি না বুঝেন তবে কেন একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে আপনার শব্দ বিভাজনের প্রয়োজন। (নোট করুন যে খালি পরিবর্তনশীল প্রসারণগুলিও বিশ্বজুড়ে পড়েছে))


ধন্যবাদ গিলস, এটি সত্যই সহায়ক! মোটামুটি কথা বলার শব্দের বিভাজন ফর্মের স্ট্রিংগুলিকে ফর্মের "word1 word2 word3"তালিকা / অ্যারে রূপান্তরিত করে বলা কি সঠিক "word1" "word2" "word3"? আমি zsh এ বিভ্রান্তির একটি নির্দিষ্ট উত্স সহ ওপি আপডেট করেছি।
আমেলিও ওয়াজকেজ-রেইনা

1
@intrpc "শব্দ বিভাজন" প্রাকৃতিক ভাষার শব্দের উপর $IFSনয় বরং অক্ষরগুলিতে বিভক্ত হচ্ছে । সুতরাং "ফিল্ড বিভাজন" একটি ভাল নাম। তবে শেল সাহিত্যে এই ধারণার জন্য প্রায়শই "শব্দ বিভাজন" ব্যবহৃত হয়। Zsh ডকুমেন্টেশন শব্দের উপর quibbling হয়।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

1
rcভেরিয়েবল এবং অ্যারে আসে যখন zsh এর থেকেও আরও উন্নত ডিজাইনের জন্য এছাড়াও (পরিকল্পনা9 শেল, ইউনিক্সে পোর্ট করা) দেখুন।
স্টাফেন চেজেলাস

3

শব্দ বিভাজন আসলে শেল নির্দিষ্ট নয়।

বেশিরভাগ প্রোগ্রামগুলিতে পাঠ্য ইনপুটকে বিশ্লেষণের প্রয়োজন প্রথম ধাপ হিসাবে শব্দ বিভাজনের কিছু ফর্ম ব্যবহার করে। এই "শব্দ", সংখ্যা, অপারেটর, স্ট্রিং, টোকেন এবং তাদের প্রক্রিয়াকরণের জন্য যে কোনও অনুরূপ সংস্থাগুলি সনাক্তকরণের আগে এটি করা হয়।

শেলগুলির সাথে সুনির্দিষ্ট যা হ'ল তারা এম্বেড করা ফাঁকা স্থান, খালি আর্গুমেন্ট, কাস্টম ডিলিমিটর এবং অন্যান্য জাতীয় কমান্ডের (C argc / argv, python sys.argv) আর্গুমেন্ট তালিকাটি সঠিকভাবে তৈরি করতে হবে। অনেক শেল সেখানে কিছুটা নমনীয়তার জন্য আইএফএস ভেরিয়েবল ব্যবহার করে।


3

Zsh এর এই নির্দিষ্ট ক্ষেত্রে, শব্দ বিভাজন ক্ষেত্র বিভাজনের চেয়ে কিছুটা আলাদাভাবে সংজ্ঞায়িত করা হয়েছে।

বিবেচনা করুন prog a b c, এটি আপনি কীভাবে সেট করবেন তা নির্ধারণ না করে এটি তিনটি যুক্তিতে পাস হবে IFS। এটি শব্দ বিভাজন।

যদি আপনি A="a b c"; prog $Aএটি করেন তবে এটি তিনটি আর্গুমেন্টে পাস করবে যদি IFSস্থান বা অন্য কোনও যুক্তি অন্তর্ভুক্ত থাকে । এটি ক্ষেত্র বিভাজন।

এখানে সংজ্ঞাগুলি সূক্ষ্ম। জেডএস ডকুমেন্টটি যা বলার চেষ্টা করছে তা হ'ল আপনি যদি সেই বিকল্পটি অক্ষম prog a b cকরেও তবুও পৃথক যুক্তি পাবেন (যা লোকে সর্বদা প্রত্যাশা করে)।


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