'Ls' এবং 'প্রতিধ্বনি (ls)' এর মধ্যে পার্থক্য


27

দুটি শেল নমুনা বিবেচনা করুন

$ ls
myDoc.html
SomeDirectory
someDoc.txt

এবং

$ echo $(ls)
myDoc.html SomeDirectory someDoc.txt

প্রথমটি কার্যকর করে lsযা, আমি যেমন বুঝতে পেরেছি, বর্তমান কার্যনির্বাহী ডিরেক্টরিগুলির বিষয়বস্তু stdoutফাইলটিতে সংযোজন করে (যা টার্মিনালটি প্রদর্শিত হয়)। এটা কি সঠিক?

দ্বিতীয়টি lsকমান্ডের মান নেয় (যার অর্থ বর্তমান কার্যনির্বাহী ডিরেক্টরিগুলির বিষয়বস্তু) এবং এটি stdoutফাইলটিতে প্রিন্ট করে । এটা কি সঠিক?

দুটি কমান্ড কেন বিভিন্ন আউটপুট দেয়?


1
কারণ আপনি প্রতিধ্বনি করছেন ইকো-র কমান্ডের ইনপুট হিসাবে ls এর আউটপুট।
আঙ্কিডেমন

এটি "প্রত্যাশিত" আচরণ, যা কেউ খুব শীঘ্রই ব্যাখ্যা করবে। তবে, আপনি কি নিশ্চিত যে lsনিজেই আপনাকে প্রতি লাইনে একাধিক আইটেম দেয় না?
রোয়াইমা

@roaima কলামাইজড এলএসএস একটি বিএসডি "বৈশিষ্ট্য" এর একটি অবশিষ্টাংশ। ইউনিক্স সংস্করণগুলি প্রতি লাইনে একটি এন্ট্রি প্রিন্ট করে
স্টিভ কক্স

@ স্টিভকক্স আমি প্রারম্ভিক এসভিআর 4 এর পর থেকে যথাযথ ইউনিক্স ব্যবহার করি নি তাই আমার স্মৃতিশক্তি কিছুটা দুর্বল। অনুস্মারক জন্য আপনাকে ধন্যবাদ.
রোয়াইমা

কেন হবে না echo *?
jd8

উত্তর:


70

আপনি যখন এই আদেশটি চালাবেন:

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

4
অতিরিক্ত হিসাবে, isattyআপনি stdout একটি tty কিনা তা পরীক্ষা করে দেখতে পারেন, রঙগুলি ব্যবহার করবেন কিনা তা নির্ধারণের জন্য ls এটি ব্যবহার করে।
জানুস ট্রয়লসেন

1
শেষ কোড স্নিপেটে কোটগুলি কী মিলছে না? বা $( )আসলে কোনও সিনট্যাক্স বাধা সরবরাহ করে যাতে আপনার বিভক্ত হওয়ার দরকার নেই?
বিড়াল

6
@ কেট $()একটি সিনট্যাক্স বাধা সরবরাহ করে।
র্যান্ডম 832

2
আরও একটি গুরুত্বপূর্ণ পার্থক্য: যদি কোনও ফাইলের নামের মধ্যে একটি ওয়াইল্ডকার্ড অক্ষর থাকে তবে echoকমান্ডটি ওয়াইল্ডকার্ডটি প্রসারিত করবে । উদাহরণস্বরূপ, যদি ফাইলls ফেরত দেয় ? file1 file2 , তারপর echo $(ls)ফিরে আসবে ফাইল? file1 file2 file1 file2
জেফিকিন্স

1
@ জেফিকিন্স echoওয়াইল্ডকার্ডগুলি প্রসারিত করে না; শেলটি আর্গুমেন্ট হিসাবে ফলস্বরূপ প্রসারণটি পাস করার আগে করে echo
চিপনার

0

ls এটি যদি টার্মিনালে আউটপুট প্রেরণ করে বা না তা অবগত।

lsকমান্ড প্রম্পটে কার্যকর করা আপনার সিউডো-টিটি-তে লিখবে। আউটপুট পুনর্নির্দেশ করা lsইচ্ছার সাধারণত না একটি সিউডো-TTY যাচ্ছে হও, lsভিন্নভাবে আউটপুট ফরম্যাট হবে।

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