गूंज `तारीख`, गूंज "` तारीख` "और गूंज` `तिथि` के बीच क्या अंतर है?


23

इन तीन आज्ञाओं में क्या अंतर है?

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

मैं इस बात पर भ्रमित हूं कि वास्तव में मतभेद क्या हैं। मुझे लगता है कि जब 'इसके आसपास का अर्थ है कि यह एक तार है, इसलिए प्रतिध्वनि का शाब्दिक रूप dateसे तारीख प्रदर्शित करने के बजाय स्ट्रिंग का उत्पादन होगा ?

जवाबों:


19

`दिनांक` केवल dateकमांड के आउटपुट में विस्तारित होगा । हालाँकि, यह उन स्थानों पर अतिरिक्त स्थान वर्णों को निकालता है जहाँ आउटपुट में एक से अधिक स्थान वर्ण होते हैं। (ऐसा इसलिए है क्योंकि कमांड प्रतिस्थापन शब्द विभाजन के अधीन है, और इस वजह से कि echoकमांड कई तर्कों को कैसे संभालता है।)

में "` date` " , डबल कोट, कमजोर उद्धरण हैं तो वे चर का विस्तार होगा (" $ पीडब्ल्यूडी "की कोशिश) और आदेश प्रतिस्थापन प्रदर्शन करते हैं। विस्तार के परिणाम को कमांड के एकल तर्क के रूप में पारित किया जाता है echo, जिसमें किसी भी लगातार रिक्त स्थान शामिल होते हैं: अर्थात, शब्द विभाजन नहीं किया जाता है।

में ' `date`' , एकल उद्धरण ताकि वे चर या आदेश प्रतिस्थापन उनके भीतर के विस्तार की अनुमति नहीं होगी, मजबूत उद्धरण हैं।

अधिक स्पष्टीकरण के लिए इस लिंक को देखें ।

नीचे दिए गए टिप्पणी में माइकल सुलेमान द्वारा सही इंगित किए गए पहले बिंदु को संपादित किया ।


1
क्या वास्तव में `चरित्र है कि आसपास की तारीख कहा जाता है? यदि मैं सही ढंग से समझ रहा हूं, तो मेटा वर्ण एकल उद्धरणों में काम नहीं करेंगे?
जॉन

यदि मैं सही ढंग से समझ रहा हूं, तो मेटा वर्ण एकल उद्धरणों में काम नहीं करेंगे?
जॉन

8
उस परिदृश्य में `को अक्सर" बैकटिक "कहा जाता है और विभिन्न यूनिक्स प्रलेखन / पुस्तकें। यह वास्तव में एक यूनिकोड गंभीर लहजे के रूप में इस्तेमाल नहीं किया जा रहा है जब यह अपने आप ही ऐसा हो, भले ही यह प्रतीक का नाम हो। और आप सही हैं कि यदि आप इसे सिंगल कोट्स के साथ घेरते हैं तो मेटाचैकर्स / एक्सप्रेशन का कोई विस्तार नहीं होगा।
जिम स्टीवर्ट

आपका पहला कथन गलत है क्योंकि दिनांक या स्थान के आधार पर आउटपुट थोड़ा भिन्न हो सकता है। केवल दूसरी कमांड नंगे dateकमांड के समान ही आउटपुट करेगी ।
जुलियाग्रे

1
@BonsiScott "Nov" और "1" के बीच का अतिरिक्त स्थान HTML में भी हटा दिया गया है;)
Izkata

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
आप अपने पहले वाक्य में आत्म विरोधाभासी हैं। पहला और दूसरा रूप हमेशा एक ही चीज़ को आउटपुट नहीं करेगा जैसा कि आप बाद में प्रदर्शित करते हैं।
जुलियाग्रे

धन्यवाद। मैंने इसे और अधिक स्पष्ट करने के लिए शब्दांकन बदल दिया है।
जिम स्टीवर्ट

3

POSIX गोले में, `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. फ़ाइलनाम पीढ़ी (उर्फ ग्लोबिंग ) (को छोड़कर 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काटते हैं , उन्हें संरक्षित करते हैं लेकिन ध्यान दें कि वैसे भी बाहरी आदेश NUL युक्त तर्क नहीं ले सकते


वास्तविक "पोसिक्स शेल" जैसी कोई चीज नहीं है। ऐसे शेल हैं जो अपनी कार्यक्षमता के सीमित उपसमूह का उपयोग करके विभिन्न प्रासंगिक POSIX मानकों के अनुरूप हो सकते हैं।
fpmurphy

0

`डेट` के साथ आपको डेट स्प्लिट का आउटपुट कई शब्दों में मिलता है, क्योंकि वर्ड स्प्लिटिंग कमांड प्रतिस्थापन के बाद की जाती है।

"` तारीख 'के साथ, आपको एक शब्द / पैरामीटर के रूप में तारीख का आउटपुट मिलता है क्योंकि दोहरे उद्धरण चिह्नों के बीच कमांड प्रतिस्थापन है, लेकिन आउटपुट आगे पार्स नहीं किया गया है। नीचे मेरे उदाहरण में "$ 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`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.