टिल्ड (~) दोहरे कोट्स के अंदर क्यों नहीं फैलता है?


54

के अनुसार यह उत्तर और मेरी अपनी समझ, टिल्ड घर निर्देशिका के लिए विस्तारित:

$ echo ~
/home/braiam

अब, जब भी मुझे काम करने के लिए शेल विस्तार चाहिए, जैसे कि चर नामों का उपयोग $FOOकरना, और अनपेक्षित वर्णों के कारण टूटना नहीं है, तो ऐसे रिक्त स्थान इत्यादि को दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए ":

$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces

यह विस्तार टिल्ड के साथ क्यों काम नहीं करता है?

$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path


3
यह भी ध्यान दें कि कमांड लाइन पर एक प्रोग्राम तर्क प्रदान करते समय यह असंगतता है कि कमांड तर्क पर --path ~/myfileविस्तार होता है, लेकिन --path=~/myfileनहीं।
.ngel



इस विषय पर एक भिन्नता unix.stackexchange.com/questions/279565 है
जेडीबीपी

जवाबों:


45

कारण, क्योंकि दोहरे उद्धरण चिह्नों के अंदर, टिल्ड ~का कोई विशेष अर्थ नहीं है, इसे शाब्दिक माना जाता है।

POSIX डबल-उद्धरण को परिभाषित करता है :

दोहरे-उद्धरणों ("") में वर्णों को जोड़ना, दोहरे अक्षरों के भीतर सभी वर्णों के शाब्दिक मूल्य को संरक्षित करेगा, वर्णों के डॉलर चिह्न, बैककोट और बैकस्लैश के अपवाद के साथ,

...

आवेदन यह सुनिश्चित करेगा कि एक दोहरे-उद्धरण दोहरे उद्धरण के भीतर शामिल करने के लिए एक बैकस्लैश से पहले है। डबल-कोट्स के अंदर पैरामीटर '@' का विशेष अर्थ है

सिवाय $, `, \और @, दूसरों के पात्रों दोहरे उद्धरण चिह्नों के अंदर के रूप में शाब्दिक व्यवहार कर रहे हैं।


9
जिस स्थिति में मुझे लगता है कि आपको उपयोग करना चाहिए $HOME
सेठ

11
या आप केवल ~उदाहरण के लिए उद्धरण नहीं दे सकते हैंls -l ~/"My Documents"
एंड्रयू मेडिको

यह बहुत गैर-सहज है। ऐसा करने के लिए उन्होंने क्या कारण चुना है? (इस उत्तर वास्तव में कारण दे नहीं है, बल्कि सिर्फ एक के लिए मानक के लिए अंक, लेकिन शायद मानक लिखा गया था कि जिस तरह से कारण ।)
मूर्ति

1
यदि आप वास्तव में "क्यों वे इस तरह लागू किया गया" चाहते हैं तो इसके बजाय स्टीफन जवाब पढ़ें ।
Braiam

2
तो, @ पवनचक्र, आकाश नीला क्यों है ? :) :) :)
जेसी चिशोल्म

32

टिल्ड विस्तार को पोसिक्स द्वारा परिभाषित किया गया है:

एक "टिल्ड-प्रीफ़िक्स" में एक शब्द के आरंभ में एक अनछुए <tilde> वर्ण होते हैं , उसके बाद सभी वर्णों में शब्द में पहला निर्विवाद <स्लैश> होता है, या यदि कोई शब्द नहीं है, तो सभी वर्ण स्लेश>। एक असाइनमेंट में, कई टिल्ड-उपसर्गों का उपयोग किया जा सकता है: [...] असाइनमेंट के <बराबर-साइन> के बाद, किसी भी अधूरे <कोलन> या दोनों के बाद। [...] यदि टिल्ड-प्रीफ़िक्स में कोई भी वर्ण उद्धृत नहीं किया जाता है, तो <tilde> के बाद वाले टिल्ड-प्रीफ़िक्स के पात्रों को उपयोगकर्ता डेटाबेस से संभावित लॉगिन नाम के रूप में माना जाता है। [...] यदि लॉगिन नाम शून्य है (यानी, टिल्ड-प्रीफ़िक्स में केवल टिल्ड होता है), टिल्ड-प्रीफ़िक्स को वैरिएबल होम के मान से बदल दिया जाता है। अगर घर परेशान है, तो परिणाम अनिर्दिष्ट हैं। [...]

तो सबसे छोटा जवाब "क्योंकि यह उस तरह से परिभाषित किया गया है": उपसर्ग सहित किसी भी वर्ण को उद्धृत करना ~, विस्तार को दबा देता है।

यह विस्तार को भी परिभाषित करता है क्योंकि हमेशा एक ही शब्द होता है, इसलिए उद्धरण अनावश्यक होगा:

टिल्ड विस्तार से उत्पन्न पथनाम को उपचार के रूप में माना जाएगा क्योंकि इसे क्षेत्र विभाजन और पथनाम विस्तार द्वारा परिवर्तित होने से रोकने के लिए उद्धृत किया गया है।

जहाँ कुछ पथ को उद्धृत करने की आवश्यकता होती है, लेकिन बाकी एक टिल्ड प्रीफ़िक्स है, आप टिल्ड विस्तार और साधारण उद्धरण को सीधे जोड़ सकते हैं:

$ cat ~/"file name with spaces"

व्यापक "क्यों" पर: चूंकि शब्द-विभाजन के लिए कोई बोधगम्य उपयोग नहीं है ~, इसलिए इसे उद्धृत करने की आवश्यकता के बजाय डिफ़ॉल्ट व्यवहार होना चाहिए। क्योंकि इसे उद्धृत करने की कोई आवश्यकता नहीं है, ~उद्धरण के अंदर एक विशेष अर्थ देना एक अनावश्यक जटिलता होगी। और, निश्चित रूप से, ऐतिहासिक कारणों का मतलब है कि इसे अब भी नहीं बदला जा सकता है, भले ही यह वांछनीय हो।


इस बैश गाइड के अनुसार , व्हाईटस्पेस अलगाव से पहले टिल्ड का विस्तार होता है । क्या कोई तरीका सुरक्षित रूप से टिल्ड का विस्तार करने का है, भले ही आप घर निर्देशिका में व्हाट्सएप करें? आमतौर पर, आप निश्चित रूप से इस तरह की बात करेंगे ""
18

विस्तार एक शब्द है; उत्तर में दूसरा उद्धृत अंश देखें।
माइकल होमर

23

~ सी-शेल में उत्पन्न होता है, बहुत पहले इसे कोर्न शेल में जोड़ा गया था और बाद में पोसिक्स शेल विनिर्देश में जोड़ा गया था।

सी-शेल में, ~एक ग्लोबिंग ऑपरेटर था ( *.txtउदाहरण के लिए एक ही विस्तार के रूप में एक ही दिनचर्या द्वारा विस्तारित ), इसलिए बाकी ग्लोबिंग की तरह डबल कोट्स के अंदर प्रदर्शन नहीं किया गया था।


11

हालांकि यह जवाब नहीं देता है कि यह इस तरह से क्यों बनाया गया है, आप $HOMEइसके बजाय इसका उपयोग करते हैं यदि आपको स्थानापन्न करने की आवश्यकता है, क्योंकि यह अनिवार्य रूप से क्या ~करता है।

$ echo "$HOME/some/path"
/home/braiam/some/path

6
यह साथ काम नहीं करता है~otheruser
जोहान्स कुह्न

2
यह सच है, लेकिन आप कर सकता है: उन्हें = ~ otheruser तो का उपयोग करें "उन्हें $ / कुछ / पथ"
melds

1
वर्कअराउंड से ~otheruserपता चलता है कि ~चर और अन्य चीजों से अलग व्यवहार करना एक बुरा विचार था जो दोहरे उद्धरण चिह्नों के अंदर विस्तारित हैं।
आइकनोकैस्टल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.