बैश चर प्रक्षेप भ्रम


1

मैं बैश चर प्रक्षेप को समझने की कोशिश कर रहा हूं।

मैं readlinkपथ को सिम्लिंक बिंदु दिखाने के लिए उपयोग करना चाहता हूं ।

अगर मैं एक स्ट्रिंग का उपयोग करता हूं तो यह काम करता है।

$ echo "$(readlink -- ~/.gitconfig)"
/Users/jord/.dotfiles/gitconfig

जब मैं एक स्ट्रिंग के बजाय एक चर का उपयोग करने का प्रयास करता हूं तो किसी कारण से यह काम नहीं करता है।

$ file="~/.gitconfig"
$ echo "$(readlink -- $file)"

खाली लाइन के अलावा कुछ भी नहीं छापा जाता है।

अगर मैं एक ही काम करता हूं, लेकिन dirname(उदाहरण के रूप में) इसके बजाय, चर प्रक्षेपवक्र काम करता है जैसा कि मैं उम्मीद करूंगा।

$ file="~/.gitconfig"
$ echo "$(dirname -- "$file")"
~

मैं क्या गलत कर रहा हूं?


क्यों echo "$(dirname -- "$file")"? सिर्फ क्यों नहीं dirname -- "$file"?
कामिल मैकियोरोस्की

एक अलग उदाहरण से कॉपी और पेस्ट करें :)
jordelver

जवाबों:


3

~उद्धरण में शाब्दिक रहता है ~बैश रेफरेंस मैनुअल का प्रासंगिक हिस्सा इसके साथ शुरू होता है

यदि कोई शब्द किसी अनछुए टिल्ड वर्ण से शुरू होता है ( ~),…

अंतर देखने के लिए, तुलना करें:

file="~/.gitconfig"
echo "$file"
file=~/".gitconfig"
echo "$file"

अपने पहले उदाहरण में पहले $(…)काम करता है और इसके संदर्भ ~में अयोग्य है। जैसा कि आप उम्मीद करते हैं, यह विस्तारित हो जाता है।

आपका $file, जब यह "काम नहीं करता" में शाब्दिक शामिल है ~POSIX मानक कहता है :

शब्द विस्तार का क्रम निम्नानुसार होगा:

टिल्ड विस्तार […], पैरामीटर विस्तार […], कमांड प्रतिस्थापन […], और अंकगणितीय विस्तार […] किया जाएगा, शुरुआत से अंत तक। [...]

क्योंकि टिल्ड का विस्तार पैरामीटर विस्तार से पहले किया जाता है, एक चर जो विस्तार ~/somethingकरता है आगे एक उचित पथ तक नहीं फैलता है ।

याद रखें ~या ~/कुछ परिस्थितियों में आपके शेल के लिए विशेष है लेकिन (लगभग?) किसी भी अन्य उपकरण के लिए यह एक मान्य पथ नहीं है। जब यह काम करता है, तो यह है क्योंकि शेल पहले अपना "जादू" करता है और दूसरा उपकरण पहले से विस्तारित पथ (जैसे /Users/jord) को देखता है ।

अपने अंतिम उदाहरण में ध्यान दें कि टिल्ड का विस्तार काम नहीं करता है, फिर भी आपको शाब्दिक रूप से मिलता है ~और शेल को अतिरिक्त ट्रिक्स (जैसे eval) के बिना इसके बारे में कुछ करने में बहुत देर हो जाती है । dirnameशिकायत नहीं करता क्योंकि यह तार के साथ काम करता है। यह ध्यान नहीं देता है कि यदि दिया गया मार्ग वैध है, विद्यमान है आदि। यह मूल रूप से अंतिम गैर-स्लेश घटक की खोज करता है और इसे पीछे चल रहे स्लैश (यदि कोई है) के साथ जोड़ता है।

इस उत्तर को भी देखें ।


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