बैश मैनुअल ( man bash) से:
कमान प्रतिस्थापन
कमांड प्रतिस्थापन एक कमांड के आउटपुट को बदलने की अनुमति देता है
कमांड का नाम। इसके दो रूप हैं:
$ (आदेश)
या
`command`
बैश एक सबहेल्ड में कमांड निष्पादित करके विस्तार करता है
पर्यावरण और मानक के साथ कमांड प्रतिस्थापन की जगह
कमांड का आउटपुट, किसी भी अनुगामी newlines के साथ हटा दिया गया है। एंबेडेड
newlines हटाए नहीं गए हैं, लेकिन उन्हें शब्द के दौरान हटाया जा सकता है
बंटवारे। कमांड प्रतिस्थापन $ (कैट फ़ाइल) द्वारा प्रतिस्थापित किया जा सकता है
समतुल्य लेकिन तेज़ $ (<फ़ाइल)।
(यह के लिए सच है सब बॉर्न की तरह गोले, यानी sh, ksh, zsh, bashआदि, और zshभी इस तरह से एम्बेडेड NUL पात्रों के साथ कब्जा डेटा करने में सक्षम है)
आदेश
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
उस निर्देशिका का नाम निर्दिष्ट करेगा जहां स्क्रिप्ट स्थित है (जबकि सभी बैकस्लैश को आगे स्लैश में बदलकर) चर में basedir। कोई भी त्रुटि, चेतावनी या अन्य नैदानिक संदेश जो मानक त्रुटि स्ट्रीम में $(...)आउटपुट होते हैं, अभी भी टर्मिनल पर प्रदर्शित होंगे ( केवल कमांड के मानक आउटपुट को कैप्चर करते हैं)।
शेल अंतरतम कमांड प्रतिस्थापन को निष्पादित करके शुरू होगा:
echo "$0" | sed -e 's,\\,/,g'
उस के आउटपुट को एक स्ट्रिंग के रूप में दिया जाएगा dirname, और उस का आउटपुट वेरिएबल को सौंपा जाएगा basedir।
डबल कोट्स यह सुनिश्चित करने के लिए हैं कि कोई शब्द-विभाजन या फ़ाइल नाम ग्लोबिंग नहीं किया जाएगा, अन्यथा आप पा सकते हैं कि स्क्रिप्ट विफल हो जाती है या अजीब आउटपुट उत्पन्न करती है जब $0(इसे निष्पादित करने के लिए उपयोग किए गए पथ सहित स्क्रिप्ट का नाम) में एक स्थान होता है चरित्र या एक फ़ाइल नाम ग्लोबिंग चरित्र (जैसे ?या *)।
यह सामान्य रूप से विस्तार (चर विस्तार, कमांड प्रतिस्थापन और अंकगणितीय विस्तार) को हमेशा उद्धृत करने के लिए एक अच्छा विचार है। देखें इस सवाल और उसके जवाब के लिए क्यों यह एक अच्छा विचार है के रूप में एक उत्कृष्ट व्याख्या के लिए।
यदि स्क्रिप्ट को निष्पादित किया गया था
$ /usr/local/bin/script.sh
तब basedirके मूल्य में मिल जाएगा /usr/local/bin।
या, साइगविन पर:
$ bash c:\\Users\\Me\\script.sh
तब basedirके मूल्य में मिल जाएगा c:/Users/Me। इस मामले में कमांड लाइन पर डबल बैकस्लैश केवल सिंगल बैकस्लैश को शेल से बचने के लिए है। का वास्तविक मूल्य $0है c:\Users\Me\script.sh।
उपयोग किए बिना एक ही काम करने का दूसरा तरीका dirname, echoऔर sedहोगा
basedir="${0//\\//}"
basedir="${basedir%/*}"
man bashऔर कमांड प्रतिस्थापन के लिए खोजें