जवाबों:
`दिनांक` केवल dateकमांड के आउटपुट में विस्तारित होगा । हालाँकि, यह उन स्थानों पर अतिरिक्त स्थान वर्णों को निकालता है जहाँ आउटपुट में एक से अधिक स्थान वर्ण होते हैं। (ऐसा इसलिए है क्योंकि कमांड प्रतिस्थापन शब्द विभाजन के अधीन है, और इस वजह से कि echoकमांड कई तर्कों को कैसे संभालता है।)
में "` 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
POSIX गोले में, `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काटते हैं , उन्हें संरक्षित करते हैं लेकिन ध्यान दें कि वैसे भी बाहरी आदेश NUL युक्त तर्क नहीं ले सकते
`डेट` के साथ आपको डेट स्प्लिट का आउटपुट कई शब्दों में मिलता है, क्योंकि वर्ड स्प्लिटिंग कमांड प्रतिस्थापन के बाद की जाती है।
"` तारीख 'के साथ, आपको एक शब्द / पैरामीटर के रूप में तारीख का आउटपुट मिलता है क्योंकि दोहरे उद्धरण चिह्नों के बीच कमांड प्रतिस्थापन है, लेकिन आउटपुट आगे पार्स नहीं किया गया है। नीचे मेरे उदाहरण में "$ i" जैसे चर विस्तार के साथ मान्य है।
'`तारीख' के साथ आपको शाब्दिक` तारीख` मिलती है क्योंकि एकल उद्धरणों के बीच कोई कमांड प्रतिस्थापन नहीं है।
शायद 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`