উত্তর:
`তারিখ` কেবল date
কমান্ডের আউটপুট প্রসারিত হবে । তবে এটি আউটপুটে একাধিক স্পেস অক্ষর থাকার জায়গাগুলিতে অতিরিক্ত স্থান অক্ষর সরিয়ে দেয়। (এটি কারণ হ'ল কমান্ড প্রতিস্থাপন শব্দ বিভাজনের সাপেক্ষে এবং echo
কমান্ডটি একাধিক যুক্তি কীভাবে পরিচালনা করে of
ইন "` date` " , ডবল কোট, দুর্বল উদ্ধৃতি চিহ্ন আছে যাতে তারা ভেরিয়েবল প্রসারিত হবে (" $ গণপূর্ত "চেষ্টা) এবং কমান্ড প্রতিকল্পন সঞ্চালন। বিস্তারের ফলাফল কমান্ডের একক যুক্তি হিসাবে পাস করা হয় echo
, কোনও ক্রমাগত স্পেস অন্তর্ভুক্ত করে: অর্থাত্ শব্দ বিভাজন হয় না ।
ইন ' `date`' , একক উদ্ধৃতি তাই তারা ভেরিয়েবল অথবা কমান্ড প্রতিকল্পন তাদের মধ্যে সম্প্রসারণ মঞ্জুরি দেয় না শক্তিশালী উদ্ধৃতি চিহ্ন আছে।
পড়ুন এই লিঙ্কে আরো ব্যাখ্যার জন্য।
নীচের মন্তব্যে মাইকেল সেলমন দ্বারা সঠিকভাবে নির্দেশিত হিসাবে প্রথম পয়েন্টটি সম্পাদনা করা হয়েছে ।
date
কমান্ডের মতোই দ্বিতীয় কমান্ড একই জিনিস আউটপুট দেয় ।
উভয়
echo `date`
এবং
echo "`date`"
তারিখটি প্রদর্শন করবে। পরেরটি থেকে আউটপুটটি date
নিজে থেকে চালানো থেকে আউটপুট বলে মনে হচ্ছে ।
একটি পার্থক্য রয়েছে, যদিও: "
উদ্ধৃতিতে ঘিরে থাকাটিকে একক যুক্তি হিসাবে "
প্রেরণ করা হবে echo
। উদ্ধৃতিগুলি একটি আর্গুমেন্ট হিসাবে পুরো কমান্ডের আউটপুটকে আবদ্ধ করে। যেহেতু echo
এর মধ্যে ফাঁক দিয়ে কেবল তার যুক্তিগুলি যথাযথভাবে প্রিন্ট করে, এটি মূলত একই রকম হবে।
সূক্ষ্ম পার্থক্যের উদাহরণ এখানে:
echo `date`
সৃষ্টি করে:
Fri Nov 1 01:48:45 EST 2013
কিন্তু:
echo "`date`"
সৃষ্টি করে:
Fri Nov 1 01:48:49 EST 2013
মনে রাখবেন যে দুটি স্পেস পরে Nov
উদ্ধৃতি ব্যতীত একটিতে কমিয়ে দেওয়া হয়েছিল। এটি কারণ শেল প্রতিটি স্পেস-বিচ্ছিন্ন উপাদানকে পার্স করছে এবং ফলাফলটি 6 টি আর্গুমেন্ট হিসাবে প্রতিধ্বনিতে প্রেরণ করছে। আপনি যখন এটি উদ্ধৃত করেন, প্রতিধ্বনি একটি একক যুক্তি পায় এবং উদ্ধৃতিগুলি স্থান ধরে রাখে।
এটি প্রতিধ্বনি বাদে অন্যান্য কমান্ডগুলিতে অনেক বেশি গুরুত্বপূর্ণ হয়ে ওঠে। উদাহরণস্বরূপ, একটি কমান্ডটি কল্পনা করুন foo
যা দুটি আর্গুমেন্ট চায়: একটি তারিখ এবং একটি ইমেল ঠিকানা।
এটি সেই পরিস্থিতিতে কাজ করবে:
foo "`date`" joeuser@example.com
তবে এটি স্ক্রিপ্টটিকে 7 টি যুক্তি প্রেরণ দ্বারা বিভ্রান্ত করবে:
foo `date` joeuser@example.com
পসিক্স শেলগুলিতে `date`
হ'ল কমান্ড প্রতিস্থাপনের প্রাচীন রূপ। আধুনিক সিনট্যাক্সটি হ'ল $(date)
।
উভয় ক্ষেত্রেই, তারা date
পিছনে থাকা নতুন লাইনের অক্ষরগুলি ছড়িয়ে দেওয়া (আউটপুটটিতে NUL টি অক্ষর না থাকে তবে) এর আউটপুট প্রসারিত হয় ।
যাইহোক, যখন ডাবল উদ্ধৃতি এবং তালিকা প্রসঙ্গে না থাকে (উদাহরণস্বরূপ echo
আপনার ক্ষেত্রে যেমন সরল কমান্ডের পক্ষে যুক্তি হিসাবে ), তখন সম্প্রসারণটি আরও বিষয় সাপেক্ষে:
শব্দের বিভাজন : এটি " date
চলমান নিউলাইন অক্ষরগুলি প্রত্যাহার করে আউটপুট"$IFS
ভ্যারিয়েবলের বর্তমান মান অনুসারে বিভক্ত হয় (স্পেস, ট্যাব এবং নিউলাইন সহ ডিফল্টরূপে zsh
) এবং কয়েকটি শব্দের সাথে বিভক্ত হয় ।
উদাহরণস্বরূপ, যদি আপনার date
আউটপুট Fri 1 Nov 14:11:15 GMT 2013\n
(যেমন এটা প্রায়ই একটি ইংরেজি লোকেলে এবং মূল ভূখন্ড ব্রিটিশ সময় অঞ্চল মধ্যে আছে), এবং $IFS
বর্তমানে রয়েছে :
, যে বিভক্ত 3 মধ্যে হতে হবে শব্দ : Fri 1 Nov 14
, 11
এবং 15 GMT 2013
।
zsh
): যে প্রতিটি শব্দ উপরে বিভাজন ফলে ওয়াইল্ডকার্ড অক্ষর খোঁজ করা হয় ( *
, ?
, [...]
যদিও কিছু শাঁস আরো আছে), এবং ফাইলের নামের ঐ নিদর্শন মেলে তালিকায় প্রসারিত করা হয়েছে। উদাহরণস্বরূপ, যদি আপনার আউটপুট date
হয় ?%? 33 */*/* UVC 3432
(যেমন এটা প্রায়ই Venusian লোকেল এবং UVC সময় অঞ্চল রয়েছে), এবং $IFS
ডিফল্ট মান হয়), তাহলে সেই সব থেকে বিস্তৃতি অ গোপন বর্তমান ডিরেক্টরী যার মধ্যম চরিত্র 3 চরিত্র ফাইলের নামের %
, 33
, বর্তমান ডিরেক্টরিতে থাকা সমস্ত গোপনীয় সাব-ডিরেক্টরিগুলির সমস্ত গোপনীয় উপ-ডিরেক্টরিতে সমস্ত গোপনীয় ফাইল UVC
এবং 3432
।এই কারণে:
$IFS
যে অক্ষরগুলিতে বিভক্ত করতে চান সেটি সেট করা উচিত ।set +f
এটিকে নিষ্ক্রিয় করতে।একক উদ্ধৃতিতে সমস্ত কিছু উদ্ধৃত হয় যার ফলে ব্যাকটিক অক্ষরগুলিকে আক্ষরিকভাবে নেওয়া যেতে পারে।
উদাহরণ (ব্যবহার করে -x
কী চলছে তা দেখতে আরও সহজ করে তোলে):
$ bash --norc -x
bash-4.2$ IFS=:
+ IFS=:
bash-4.2$ echo `date`
++ date
+ echo 'Fri 1 Nov 14' 42 '33 GMT 2013'
Fri 1 Nov 14 42 33 GMT 2013
bash-4.2$ echo "`date`"
++ date
+ echo 'Fri 1 Nov 14:42:41 GMT 2013'
Fri 1 Nov 14:42:41 GMT 2013
bash-4.2$ cd /lib/modules
+ cd /lib/modules
bash-4.2$ export TZ=UVC LC_ALL=vs_VS
+ export TZ=UVC LC_ALL=vs_VS
+ TZ=UVC
+ LC_ALL=vs_VS
bash-4.2$ unset -v IFS # get the default behaviour
+ unset -v IFS
bash-4.2$ echo `date`
++ date
+ echo '?%?' 33 3.10-2-amd64/build/arch 3.10-2-amd64/build/include 3.10-2-amd64/build/Makefile 3.10-2-amd64/build/Module.symvers 3.10-2-amd64/build/scripts 3.10-2-amd64/kernel/arch 3.10-2-amd64/kernel/crypto 3.10-2-amd64/kernel/drivers 3.10-2-amd64/kernel/fs 3.10-2-amd64/kernel/lib 3.10-2-amd64/kernel/mm 3.10-2-amd64/kernel/net 3.10-2-amd64/kernel/sound 3.10-2-amd64/source/arch 3.10-2-amd64/source/include 3.10-2-amd64/source/Makefile 3.10-2-amd64/source/scripts 3.10-2-amd64/updates/dkms 3.10-3-amd64/build/arch 3.10-3-amd64/build/include 3.10-3-amd64/build/Makefile 3.10-3-amd64/build/Module.symvers 3.10-3-amd64/build/scripts 3.10-3-amd64/kernel/arch 3.10-3-amd64/kernel/crypto 3.10-3-amd64/kernel/drivers 3.10-3-amd64/kernel/fs 3.10-3-amd64/kernel/lib 3.10-3-amd64/kernel/mm 3.10-3-amd64/kernel/net 3.10-3-amd64/kernel/sound 3.10-3-amd64/source/arch 3.10-3-amd64/source/include 3.10-3-amd64/source/Makefile 3.10-3-amd64/source/scripts 3.10-3-amd64/updates/dkms UVC 3432
?%? 33 3.10-2-amd64/build/arch 3.10-2-amd64/build/include 3.10-2-amd64/build/Makefile 3.10-2-amd64/build/Module.symvers 3.10-2-amd64/build/scripts 3.10-2-amd64/kernel/arch 3.10-2-amd64/kernel/crypto 3.10-2-amd64/kernel/drivers 3.10-2-amd64/kernel/fs 3.10-2-amd64/kernel/lib 3.10-2-amd64/kernel/mm 3.10-2-amd64/kernel/net 3.10-2-amd64/kernel/sound 3.10-2-amd64/source/arch 3.10-2-amd64/source/include 3.10-2-amd64/source/Makefile 3.10-2-amd64/source/scripts 3.10-2-amd64/updates/dkms 3.10-3-amd64/build/arch 3.10-3-amd64/build/include 3.10-3-amd64/build/Makefile 3.10-3-amd64/build/Module.symvers 3.10-3-amd64/build/scripts 3.10-3-amd64/kernel/arch 3.10-3-amd64/kernel/crypto 3.10-3-amd64/kernel/drivers 3.10-3-amd64/kernel/fs 3.10-3-amd64/kernel/lib 3.10-3-amd64/kernel/mm 3.10-3-amd64/kernel/net 3.10-3-amd64/kernel/sound 3.10-3-amd64/source/arch 3.10-3-amd64/source/include 3.10-3-amd64/source/Makefile 3.10-3-amd64/source/scripts 3.10-3-amd64/updates/dkms UVC 3432
bash-4.2$ echo "`date`"
++ date
+ echo '?%? 33 */*/* UVC 3432'
?%? 33 */*/* UVC 3432
যদি আউটপুটটিতে NUL টি অক্ষর থাকে তবে আচরণটি শেল থেকে শেল পর্যন্ত পরিবর্তিত হয়: কিছু এগুলি সরিয়ে দেয়, কেউ কেউ প্রথম NUL অক্ষরে আউটপুট কেটে দেয়, zsh
সংরক্ষণ করে তবে মনে রাখবেন যে বাহ্যিক কমান্ডগুলি NULs যুক্ত যুক্তি নিতে পারে না
`তারিখ` দিয়ে আপনি তারিখের আউটপুট একাধিক শব্দের মধ্যে বিভক্ত হন কারণ শব্দ বিভাজন কমান্ড প্রতিস্থাপনের পরে সম্পন্ন হয়।
"` তারিখ` "দিয়ে আপনি ডাবল উদ্ধৃতিগুলির মধ্যে কমান্ড প্রতিস্থাপনের কারণ হিসাবে একটি শব্দ / পরামিতি হিসাবে তারিখের আউটপুট পাবেন তবে আউটপুটটি আরও বিশ্লেষণ করা হবে না। নীচের আমার উদাহরণে "$ i" এর মতো চলক প্রসারণের সাথে একই বৈধ।
'Quot তারিখ'-এর সাথে আপনি আক্ষরিক `তারিখ পেয়ে যাবেন কারণ একক উদ্ধৃতিগুলির মধ্যে কোনও আদেশের বিকল্প নেই।
সম্ভবত 3 টি ফর্মের পার্থক্য এইভাবে আরও দৃশ্যমান হবে:
> for i in `date`; do echo "$i"; done
Fr
1.
Nov
12:25:30
CET
2013
> for i in "`date`"; do echo "$i"; done
Fr 1. Nov 12:25:38 CET 2013
> for i in '`date`'; do echo "$i"; done
`date`