আইএফএসের ডিফল্ট মান বোঝা


10

আমার জিএনইউ বাশ সংস্করণ ৪.২.৮ এ, আইএফএসের স্থান, ট্যাব এবং লাইন ফিডের একটি ডিফল্ট মান ডিফল্টরূপে থাকে:

usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000  20 09 0a                                          | ..|
00000003
usr@T42 ~ $ 

এই ধরনের ডিফল্ট আইএফএসের কোনও কারণ আছে? এছাড়াও, কোন ইউটিলিটিগুলি অন্তর্নির্মিত বাশ ছাড়াও আইএফএস ব্যবহার করে read?

উত্তর:


13

আইএফএস ভেরিয়েবল প্রতিবার শেল শব্দের বিভাজন বলা কোনও কাজ সম্পাদন করে । এটি ব্যবহৃত হয় সবচেয়ে সাধারণ ক্ষেত্রে প্যারামিটার বিস্তৃতি (উদাঃ $var) বা কমান্ড প্রতিস্থাপন (যেমন $(some-command)বা কমান্ড ব্যাকটিক্স) একটি কমান্ড পরে। এখানে যদি প্রসারণে কোনও IFSঅক্ষর থাকে তবে কমান্ডটি প্রক্রিয়া করার আগে এটি বিভিন্ন 'শব্দের' মধ্যে বিভক্ত হয়। কার্যকরভাবে এর অর্থ হ'ল এই অক্ষরগুলি পরিবর্তিত পাঠ্যকে বিভিন্ন যুক্তিতে বিভক্ত করে (ভেরিয়েবলটি প্রথমে নির্দিষ্ট করা থাকলে কমান্ডের নাম সহ)।

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

শব্দের বিভক্ত হওয়া থেকে রোধ করার একটি উপায় হ'ল সম্প্রসারণ ( "$var") এর চারপাশে ডাবল কোট ব্যবহার করা - বাস্তবে আপনি আপনার প্রশ্নে এটি করেছেন। আপনি যদি এটি না করেন তবে কোনও আউটপুট আসবে না echoকারণ এতে কোনও আর্গুমেন্ট থাকবে না, কেবল অক্ষরগুলি বিভক্ত করার যুক্তি।

আরও লক্ষ করুন যে দুটি জায়গাগুলি যেখানে শব্দ বিভাজন প্যারামিটার বিস্তারের পরে ঘটে না সেটি ভেরিয়েবল অ্যাসাইনমেন্টের সাথে হয় (যেমন var=$othervarএবং var=$(somecommand)ঠিক আছে), এবং [[ ]]কনস্ট্রাক্টের মধ্যে ( [[ $var = $othervar ]]ঠিক আছে তবে [ $var = $othervar ]উদ্ধৃত হওয়া উচিত)।

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

var=*
echo $var

এটি বর্তমান ডিরেক্টরিতে ফাইলগুলির নাম প্রদর্শন করবে।

স্টিফেন নীচে যেমন উল্লেখ করেছেন , IFSপ্রসারিত হওয়ার সাথে সাথে অক্ষরের ক্রমটি উল্লেখযোগ্য "$*"। থেকে bashমানুষ পৃষ্ঠা:

"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable.  If IFS is unset, the parameters are separated by spaces.  If
IFS is null, the parameters are joined without intervening separators.

শব্দ বিভাজনের আরও উদাহরণের জন্য, দয়া করে এই উত্তরটি দেখুন - https://unix.stackexchange.com/a/118444/48083


1
প্রথম চরিত্রটিও $IFSব্যবহৃত হয় "$*"যার কারণে আদেশের বিষয়টি গুরুত্বপূর্ণ।
স্টাফেন চেজেলাস 20'14

2
এছাড়াও খেয়াল করুন যে zshএর ডিফল্টটিতে NUL অক্ষর অন্তর্ভুক্ত রয়েছে $IFS(অন্যান্য শেলগুলি NU অক্ষরকে তাদের ভেরিয়েবলগুলিতে ধারণ করে না)।
স্টাফেন চেজেলাস 20'14
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.