আপনি যখন এই আদেশটি চালাবেন:
ls
টার্মিনাল এর আউটপুট প্রদর্শন করে ls।
আপনি যখন এই আদেশটি চালাবেন:
echo $(ls)
শেল আউটপুট ক্যাপচার করে $(ls)এবং এতে শব্দ বিভাজন সম্পাদন করে। ডিফল্টর সাথে IFS, এর অর্থ হ'ল নতুন লাইনের অক্ষরগুলি সহ সাদা স্থানের সমস্ত ক্রমগুলি একটি ফাঁকা দ্বারা প্রতিস্থাপিত হয়। একারণে আউটপুট echo $(ls)প্রদর্শিত হয়।
শব্দ বিভাজনের বিষয়ে উন্নত আলোচনার জন্য গ্রেগের প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী দেখুন ।
শব্দ বিভাজন দমন
শেলটি উদ্ধৃতিতে স্ট্রিংগুলিতে শব্দ বিভাজন সম্পাদন করে না। সুতরাং, আপনি শব্দ বিভাজন দমন করতে পারেন এবং এর সাথে মাল্টলাইন আউটপুট ধরে রাখতে পারেন:
echo "$(ls)"
ls এবং মাল্টলাইন আউটপুট
আপনি লক্ষ্য করেছেন যে lsকখনও কখনও প্রতি লাইনে একাধিক ফাইল প্রিন্ট করে:
$ ls
file1 file2 file3 file4 file5 file6
lsটার্মিনালে আউটপুট গেলে এটি ডিফল্ট হয়। যখন আউটপুট সরাসরি টার্মিনালে চলে না যায়, তখন lsতার ডিফল্টকে প্রতি লাইনে একটি ফাইলে পরিবর্তন করে:
$ echo "$(ls)"
file1
file2
file3
file4
file5
file6
এই আচরণটি নথিভুক্ত করা হয় man ls।
আর একটি সূক্ষ্মতা: কমান্ড প্রতিস্থাপন এবং নতুন লাইনের পিছনে
$(...)হ'ল কমান্ড সাবস্টিটিউশন এবং শেলটি কমান্ড প্রতিস্থাপনের আউটপুট থেকে নতুন লাইনের অক্ষরগুলি সরিয়ে দেয় । এটি সাধারণত লক্ষণীয় নয় কারণ ডিফল্টরূপে, echoএর আউটপুট শেষে একটি নতুন লাইন যুক্ত করে। সুতরাং, যদি আপনি শেষের দিক থেকে একটি নতুন লাইন হারিয়ে ফেলেন $(...)এবং আপনি echoযদি এটি থেকে একটি অর্জন করেন তবে কোনও পরিবর্তন নেই। তবে, যদি আপনার কমান্ডের আউটপুট 2 বা ততোধিক নিউলাইন অক্ষরের সাথে শেষ হয় এবং echoকেবলমাত্র একটি যোগ করে, আপনার আউটপুটটি এক বা একাধিক নতুন লাইন অনুপস্থিত হবে। উদাহরণস্বরূপ, আমরা printfনতুন লাইনের অক্ষর তৈরি করতে ব্যবহার করতে পারি । নোট করুন যে নিম্নলিখিত দুটি কমান্ডই বিভিন্ন নতুন লাইনের পরেও একটি ফাঁকা লাইনের একই আউটপুট উত্পাদন করে:
$ echo "$(printf "\n")"
$ echo "$(printf "\n\n\n\n\n")"
$
এই আচরণটি নথিভুক্ত করা হয় man bash।
আরেকটি আশ্চর্য: পথের নাম সম্প্রসারণ, দু'বার
তিনটি ফাইল তৈরি করা যাক:
$ touch 'file?' file1 file2
ls file?এবং এর মধ্যে পার্থক্যটি পর্যবেক্ষণ করুন echo $(ls file?):
$ ls file?
file? file1 file2
$ echo $(ls file?)
file? file1 file2 file1 file2
এর ক্ষেত্রে echo $(ls file?), ফাইল গ্লোব দু'বারfile? প্রসারিত হয় , যার ফলে ফাইলের নাম হয় file1এবং file2আউটপুটে দু'বার প্রদর্শিত হয়। এটা এজন্য যে, যেমন Jeffiekins পয়েন্ট আউট হল, পথনাম সম্প্রসারণ প্রথম শেল দ্বারা সামনে সঞ্চালিত হয় lsচালানো হয় এবং তারপর আবার সামনে echoচালানো হয়।
আমরা যদি ডাবল-কোট ব্যবহার করি তবে দ্বিতীয় পথের নামটি প্রসারিত করা যায়:
$ echo "$(ls file?)"
file?
file1
file2