कमांड के रूप में बैकस्लैश डॉट का क्या अर्थ है?


17

एक सॉफ्टवेयर जो मैंने स्थापित किया है उसमें मेरी प्रोफ़ाइल में एक पंक्ति सम्मिलित है जो पढ़ता है:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

मुझे पता है कि डॉट .का पर्यायवाची है source, इसलिए मुझे संदेह है कि यह सिर्फ फ़ाइल को सोर्स कर रहा है, लेकिन मैंने पहले कभी नहीं देखा है \.; यह कुछ और करता है?

DVs के बारे में संपादित करें: "बैकस्लैश डॉट" के लिए खोज करने से ./निष्पादन योग्य फ़ाइलों को कॉल करने के संबंध में प्रश्न उत्पन्न होते हैं , और man sourceएक मैनपेज की ओर जाता है जहां \.प्रकट नहीं होता है। मुझे नहीं पता कि और क्या प्रयास करना है, इसलिए सवाल।

संपादित 2: संबंधित प्रश्न देखें

जवाबों:


31

उद्धरण के बाहर एक बैकस्लैश का अर्थ है "पार्सिंग के दौरान अगले वर्ण का शाब्दिक अर्थ"। चूंकि .पार्सर के लिए एक साधारण चरित्र है, \.उसी तरह से पार्स किया जाता है ., और बिलिन .(जिनमें sourceसे एक बाश में एक पर्याय है) को आमंत्रित करता है ।

एक मामला है जहां यह इस संदर्भ में फर्क कर सकता है। यदि किसी उपयोगकर्ता ने .पहले कहे जाने वाले उपनाम को परिभाषित किया है .profile, और .profileइसे एक शेल में पढ़ा जा रहा है जो एलियास का विस्तार करता है (जो केवल संवादात्मक रूप से आह्वान करने पर डिफ़ॉल्ट रूप से बश करता है), तो .उपनाम को ट्रिगर करेगा, लेकिन \.फिर भी बिलिन को ट्रिगर करेगा, क्योंकि शेल किसी भी तरह से उद्धृत किए गए शब्दों पर उपनाम के विस्तार की कोशिश नहीं करता है।

मुझे संदेह है कि एक उपयोगकर्ता द्वारा शिकायत किए जाने के बाद .उसे बदल दिया गया था \.क्योंकि उन्होंने इसके लिए एक उपनाम बनाया था .

ध्यान दें कि \.एक फ़ंक्शन बुलाया जाएगा .। संभवतः उपयोगकर्ता जो फ़ंक्शन लिखते हैं, वे उन उपयोगकर्ताओं की तुलना में अधिक जानकार हैं जो उपनाम लिखते हैं और जानते होंगे कि .profileयदि आप तृतीय पक्षों से कोड शामिल करने जा रहे हैं, तो एक मानक आदेश को फिर से परिभाषित करना एक बुरा विचार है। लेकिन अगर आप दोनों उपनामों और कार्यों को बायपास करना चाहते हैं, तो आप लिख सकते हैं command .। इस स्निपेट के लेखक ने ऐसा नहीं किया क्योंकि उन्होंने एंटीक शेल के बारे में परवाह की थी जिसमें commandबिलिन नहीं था , या अधिक संभावना थी क्योंकि उन्हें इसके बारे में पता नहीं था।

वैसे, किसी भी उपनाम को परिभाषित .profileकरना एक बुरा विचार है क्योंकि .profileएक सत्र आरंभीकरण स्क्रिप्ट है, न कि शेल आरंभीकरण स्क्रिप्ट। बैश के लिए उपनाम में संबंधित हैं .bashrc


9

\.एक "शाब्दिक डॉट", यानी केवल एक बिंदु है। इसे मानक .कमांड (समान ) sourceमें लिया जाएगा bash

POSIX मानक के पास इस बारे में कहने के लिए है (मेरा जोर)

<backslash>कि उद्धृत नहीं है, निम्नलिखित चरित्र के शाब्दिक मूल्य को संरक्षित करेगा , एक के अपवाद के साथ <newline>। यदि <newline>निम्नानुसार है <backslash>, तो शेल इसे रेखा निरंतरता के रूप में व्याख्या करेगा। और बंटवारे से पहले टोकन में इनपुट हटाया किया जाएगा । चूंकि बच गया पूरी तरह से इनपुट से हटा दिया गया है और इसे किसी भी सफेद स्थान से नहीं बदला गया है, यह टोकन विभाजक के रूप में काम नहीं कर सकता है।<backslash><newline><newline>

डॉट कैरेक्टर अलियास किया जा सकता है:

$ alias .='echo hello'
$ .
hello

जिसका अर्थ है कि कमांड \.के उपनाम संस्करण का उपयोग करने से बचें ., क्योंकि ,

टोकन के बाद सीमांकित किया गया है, लेकिन शैल व्याकरण में व्याकरण के नियमों को लागू करने से पहले, एक परिणामी शब्द जिसे एक साधारण कमांड के कमांड नाम के रूप में पहचाना जाता है, यह निर्धारित करने के लिए जांच की जाएगी कि क्या यह एक अयोग्य , वैध एलियन नाम है।


मैं आधिकारिक स्रोत की तलाश कर रहा था कि कैसे एक शब्द में बैकस्लैश को उद्धृत करने के रूप में व्याख्या की जाती है, और यह कैसे उर्फ ​​विस्तार को रोकता है। संदर्भ के लिए धन्यवाद!
शेलजॉन

1
@ शलजोह अद्यतन जवाब देखें।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.