প্রতিধ্বনি `তারিখ`, প্রতিধ্বনি" `তারিখ`", এবং '`তারিখ'-এর মধ্যে পার্থক্য কী?


23

এই তিনটি আদেশের মধ্যে পার্থক্য কী?

echo `date`
echo "`date`"
echo '`date`'

পার্থক্য আসলে কী তা নিয়ে আমি বিভ্রান্ত। আমি মনে করি যে যখন 'এর চারপাশে রয়েছে তার অর্থ এটি একটি স্ট্রিং, সুতরাং প্রতিধ্বনিতাই আক্ষরিকভাবে dateতারিখটি প্রদর্শন করার পরিবর্তে স্ট্রিং আউটপুট দেবে ?

উত্তর:


19

`তারিখ` কেবল dateকমান্ডের আউটপুট প্রসারিত হবে । তবে এটি আউটপুটে একাধিক স্পেস অক্ষর থাকার জায়গাগুলিতে অতিরিক্ত স্থান অক্ষর সরিয়ে দেয়। (এটি কারণ হ'ল কমান্ড প্রতিস্থাপন শব্দ বিভাজনের সাপেক্ষে এবং echoকমান্ডটি একাধিক যুক্তি কীভাবে পরিচালনা করে of

ইন "` date` " , ডবল কোট, দুর্বল উদ্ধৃতি চিহ্ন আছে যাতে তারা ভেরিয়েবল প্রসারিত হবে (" $ গণপূর্ত "চেষ্টা) এবং কমান্ড প্রতিকল্পন সঞ্চালন। বিস্তারের ফলাফল কমান্ডের একক যুক্তি হিসাবে পাস করা হয় echo, কোনও ক্রমাগত স্পেস অন্তর্ভুক্ত করে: অর্থাত্ শব্দ বিভাজন হয় না

ইন ' `date`' , একক উদ্ধৃতি তাই তারা ভেরিয়েবল অথবা কমান্ড প্রতিকল্পন তাদের মধ্যে সম্প্রসারণ মঞ্জুরি দেয় না শক্তিশালী উদ্ধৃতি চিহ্ন আছে।

পড়ুন এই লিঙ্কে আরো ব্যাখ্যার জন্য।

নীচের মন্তব্যে মাইকেল সেলমন দ্বারা সঠিকভাবে নির্দেশিত হিসাবে প্রথম পয়েন্টটি সম্পাদনা করা হয়েছে ।


1
তারিখের চারপাশে থাকা `চরিত্রটিকে ঠিক কী বলা হয়? আমি যদি সঠিকভাবে বুঝতে পারি, মেটা অক্ষরগুলি একক উদ্ধৃতিতে কাজ করবে না?
জন

আমি যদি সঠিকভাবে বুঝতে পারি, মেটা অক্ষরগুলি একক উদ্ধৃতিতে কাজ করবে না?
জন

8
সেই দৃশ্য এবং বিভিন্ন ইউনিক্স ডকুমেন্টেশন / বইগুলিতে `প্রায়শই" ব্যাকটিক "নামে পরিচিত। এটি আসলে ইউনিকোডের গ্রাভ অ্যাকসেন্ট হিসাবে ব্যবহৃত হচ্ছে না যখন এটি নিজের মতো হয়, যদিও এটি প্রতীকের নাম। এবং আপনি ঠিক বলেছেন যে আপনি যদি একক উদ্ধৃতি দিয়ে এটিকে ঘিরে থাকেন তবে মেটাচ্যারেক্টার / এক্সপ্রেশনগুলির কোনও সম্প্রসারণ ঘটবে না।
জিম স্টুয়ার্ট

তারিখ বা লোকেলের উপর নির্ভর করে আউটপুটটি কিছুটা আলাদা হতে পারে বলে আপনার প্রথম বিবৃতিটি ভুল। খালি dateকমান্ডের মতোই দ্বিতীয় কমান্ড একই জিনিস আউটপুট দেয় ।
jlliagre

1
@ বনসিস্কট "নভেম্বর" এবং "1" এর মধ্যে অতিরিক্ত স্থানটি এইচটিএমএলেও সরানো হবে;)
ইজকাটা

16

উভয়

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

3
আপনি নিজের প্রথম বাক্যে স্ববিরোধী। প্রথম এবং দ্বিতীয় ফর্মটি সর্বদা একই জিনিস আউটপুট দেয় না আপনি যেমন পরে দেখান।
jlliagre

ধন্যবাদ। আমি আরও স্পষ্ট করতে শব্দটির পরিবর্তন করেছি।
জিম স্টুয়ার্ট

3

পসিক্স শেলগুলিতে `date`হ'ল কমান্ড প্রতিস্থাপনের প্রাচীন রূপ। আধুনিক সিনট্যাক্সটি হ'ল $(date)

উভয় ক্ষেত্রেই, তারা dateপিছনে থাকা নতুন লাইনের অক্ষরগুলি ছড়িয়ে দেওয়া (আউটপুটটিতে NUL টি অক্ষর না থাকে তবে) এর আউটপুট প্রসারিত হয় ।

যাইহোক, যখন ডাবল উদ্ধৃতি এবং তালিকা প্রসঙ্গে না থাকে (উদাহরণস্বরূপ echoআপনার ক্ষেত্রে যেমন সরল কমান্ডের পক্ষে যুক্তি হিসাবে ), তখন সম্প্রসারণটি আরও বিষয় সাপেক্ষে:

  1. শব্দের বিভাজন : এটি " dateচলমান নিউলাইন অক্ষরগুলি প্রত্যাহার করে আউটপুট"$IFS ভ্যারিয়েবলের বর্তমান মান অনুসারে বিভক্ত হয় (স্পেস, ট্যাব এবং নিউলাইন সহ ডিফল্টরূপে zsh) এবং কয়েকটি শব্দের সাথে বিভক্ত হয় ।

    উদাহরণস্বরূপ, যদি আপনার dateআউটপুট Fri 1 Nov 14:11:15 GMT 2013\n(যেমন এটা প্রায়ই একটি ইংরেজি লোকেলে এবং মূল ভূখন্ড ব্রিটিশ সময় অঞ্চল মধ্যে আছে), এবং $IFSবর্তমানে রয়েছে :, যে বিভক্ত 3 মধ্যে হতে হবে শব্দ : Fri 1 Nov 14, 11এবং 15 GMT 2013

  2. ফাইলের নাম প্রজন্মের (ওরফে globbing ) (সঙ্গে ব্যতীত zsh): যে প্রতিটি শব্দ উপরে বিভাজন ফলে ওয়াইল্ডকার্ড অক্ষর খোঁজ করা হয় ( *, ?, [...]যদিও কিছু শাঁস আরো আছে), এবং ফাইলের নামের ঐ নিদর্শন মেলে তালিকায় প্রসারিত করা হয়েছে। উদাহরণস্বরূপ, যদি আপনার আউটপুট dateহয় ?%? 33 */*/* UVC 3432(যেমন এটা প্রায়ই Venusian লোকেল এবং UVC সময় অঞ্চল রয়েছে), এবং $IFSডিফল্ট মান হয়), তাহলে সেই সব থেকে বিস্তৃতি অ গোপন বর্তমান ডিরেক্টরী যার মধ্যম চরিত্র 3 চরিত্র ফাইলের নামের %, 33, বর্তমান ডিরেক্টরিতে থাকা সমস্ত গোপনীয় সাব-ডিরেক্টরিগুলির সমস্ত গোপনীয় উপ-ডিরেক্টরিতে সমস্ত গোপনীয় ফাইল UVCএবং 3432

এই কারণে:

  1. আপনি সর্বদা কমান্ড বদল (উদ্ধৃতি চিহ্ন সহ) উদ্ধৃত উচিত নয় যদি না আপনি হয় চাও শব্দ বিভাজন বা ফাইলের নাম প্রজন্ম তার বিস্তার উপর সঞ্চালিত
  2. আপনি যদি শব্দ বিভাজন করতে চান , তবে আপনি $IFSযে অক্ষরগুলিতে বিভক্ত করতে চান সেটি সেট করা উচিত ।
  3. আপনি চান না শব্দ বিভাজন কিন্তু ফাইলের নাম প্রজন্ম , আপনি একটি ইস্যু করতে প্রয়োজন 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 যুক্ত যুক্তি নিতে পারে না


আসল "পসিক্স শেল" বলে কোনও জিনিস নেই। এমন শেলগুলি রয়েছে যা তাদের কার্যকারিতার সীমিত উপসেটটি ব্যবহার করে বিভিন্ন প্রাসঙ্গিক পসিক্স মানগুলির সাথে সামঞ্জস্য করতে পারে।
এফএমপুরফি

0

`তারিখ` দিয়ে আপনি তারিখের আউটপুট একাধিক শব্দের মধ্যে বিভক্ত হন কারণ শব্দ বিভাজন কমান্ড প্রতিস্থাপনের পরে সম্পন্ন হয়।

"` তারিখ` "দিয়ে আপনি ডাবল উদ্ধৃতিগুলির মধ্যে কমান্ড প্রতিস্থাপনের কারণ হিসাবে একটি শব্দ / পরামিতি হিসাবে তারিখের আউটপুট পাবেন তবে আউটপুটটি আরও বিশ্লেষণ করা হবে না। নীচের আমার উদাহরণে "$ 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`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.