~उद्धरण में शाब्दिक रहता है ~। बैश रेफरेंस मैनुअल का प्रासंगिक हिस्सा इसके साथ शुरू होता है
यदि कोई शब्द किसी अनछुए टिल्ड वर्ण से शुरू होता है ( ~),…
अंतर देखने के लिए, तुलना करें:
file="~/.gitconfig"
echo "$file"
file=~/".gitconfig"
echo "$file"
अपने पहले उदाहरण में पहले $(…)काम करता है और इसके संदर्भ ~में अयोग्य है। जैसा कि आप उम्मीद करते हैं, यह विस्तारित हो जाता है।
आपका $file, जब यह "काम नहीं करता" में शाब्दिक शामिल है ~। POSIX मानक कहता है :
शब्द विस्तार का क्रम निम्नानुसार होगा:
टिल्ड विस्तार […], पैरामीटर विस्तार […], कमांड प्रतिस्थापन […], और अंकगणितीय विस्तार […] किया जाएगा, शुरुआत से अंत तक। [...]
क्योंकि टिल्ड का विस्तार पैरामीटर विस्तार से पहले किया जाता है, एक चर जो विस्तार ~/somethingकरता है आगे एक उचित पथ तक नहीं फैलता है ।
याद रखें ~या ~/कुछ परिस्थितियों में आपके शेल के लिए विशेष है लेकिन (लगभग?) किसी भी अन्य उपकरण के लिए यह एक मान्य पथ नहीं है। जब यह काम करता है, तो यह है क्योंकि शेल पहले अपना "जादू" करता है और दूसरा उपकरण पहले से विस्तारित पथ (जैसे /Users/jord) को देखता है ।
अपने अंतिम उदाहरण में ध्यान दें कि टिल्ड का विस्तार काम नहीं करता है, फिर भी आपको शाब्दिक रूप से मिलता है ~और शेल को अतिरिक्त ट्रिक्स (जैसे eval) के बिना इसके बारे में कुछ करने में बहुत देर हो जाती है । dirnameशिकायत नहीं करता क्योंकि यह तार के साथ काम करता है। यह ध्यान नहीं देता है कि यदि दिया गया मार्ग वैध है, विद्यमान है आदि। यह मूल रूप से अंतिम गैर-स्लेश घटक की खोज करता है और इसे पीछे चल रहे स्लैश (यदि कोई है) के साथ जोड़ता है।
इस उत्तर को भी देखें ।
echo "$(dirname -- "$file")"? सिर्फ क्यों नहींdirname -- "$file"?