जवाबों:
`दिनांक` केवल 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`