2013-08-01 5 views
60

मैं सिर्फ खोल में कोड की निम्नलिखित पंक्ति को समझना चाहता हूं। इसका उपयोग वर्तमान कार्यशील निर्देशिका प्राप्त करने के लिए किया जाता है। मुझे पता है कि $(variable) नाम वैरिएबल नाम के भीतर मूल्य वापस कर देता है, लेकिन $(command) क्या वापस जाना है? क्या यह आदेश निष्पादित करने के बाद मान वापस करता है? उस स्थिति में, हम कमांड निष्पादित करने के लिए ` का उपयोग कर सकते हैं।

CWD="$(cd "$(dirname $0)"; pwd)" 

एक ही उत्पादन खोल

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

के विभिन्न संस्करण में भी निम्न कोड पंक्ति से लिया जा सकता है मैं $(cd.. और $(dirname का अर्थ समझने में असमर्थ हूँ।

क्या कोई यह जानने में मेरी सहायता कर सकता है कि यह आदेश कैसे निष्पादित किया जाता है?

+1

और यहां '$()' बनाम '\' \ '' के फायदे/नुकसान के बारे में एक सवाल है: http://stackoverflow.com/questions/9449778/what-is-the-benefit-of- उपयोग-बदले-बैकटिक्स-इन-शेल-स्क्रिप्ट –

उत्तर

65

$ का उपयोग ${HOME} जैसे होम का मूल्य देता है। $ का उपयोग $(echo foo) का अर्थ है सबकुछ में ब्रांड्स के अंदर जो कुछ भी है उसे चलाएं और इसे मान के रूप में वापस करें। मेरे उदाहरण में, आप मिल fooecho के बाद से बाहर

+6

एक ही चीज़ \ e echo foo \ 'द्वारा की जाती है, क्या मैं सही हूँ? – KItis

+25

हां; '$ (...) 'वापस उद्धरणों का उपयोग करने की कोशिश करने से कमांड लिखने का एक बेहतर तरीका है। लिखने पर विचार करें: 'gcclib = $ (dirname $ (dirname $ (जो gcc)))/lib' वापस उद्धरण का उपयोग कर। मार्कडाउन में इसे करने की कठिनाइयों में आने से पहले, यह कठिन है क्योंकि आपको नेस्टेड कमांड के बैकक्वॉट से बचना है, जबकि आप '$ (...) 'नोटेशन के साथ नहीं हैं। –

+6

तकनीकी रूप से, '$ (गूंज foo)' एक कमांड प्रतिस्थापन बनाता है, न कि सबहेल। दूसरा वर्तमान उत्तर यह अधिकार प्राप्त करता है। मुझे लगता है कि कमांड प्रतिस्थापन एक सबहेल में चलाया जाता है, लेकिन वे अभी भी अलग-अलग अवधारणाएं हैं। – trysis

15
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

Could anybody help me to figure out how this command get executed?

मानक के foo लिखेंगे चलो आदेश के विभिन्न भागों पर विचार करेंगे। BASH_SOURCE एक बैश सरणी चर है जिसमें स्रोत फ़ाइल नाम हैं। तो "${BASH_SOURCE[0]}" आपको स्क्रिप्ट फ़ाइल का नाम वापस कर देगा।

dirname जीएनयू कोर्यूटिल्स द्वारा प्रदान की जाने वाली एक उपयोगिता है जो फ़ाइल नाम से अंतिम घटक को हटाती है। इस प्रकार यदि आप bash foo, "$(dirname "${BASH_SOURCE[0]}")" कहकर अपनी स्क्रिप्ट निष्पादित करते हैं तो . वापस आ जाएगा। यदि आपने bash ../foo कहा, तो यह .. लौटाएगा; bash /some/path/foo के लिए यह /some/path वापस करेगा।

अंत में, संपूर्ण कमांड "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" को पूर्ण निर्देशिका प्राप्त होती है जिसमें स्क्रिप्ट शामिल की जाती है।

$(...) कमांड प्रतिस्थापन की अनुमति देता है, यानी कमांड को प्रतिस्थापित करने के लिए कमांड के आउटपुट की अनुमति देता है और इसे घोंसला जा सकता है।

+0

पार्टी के लिए 3 साल देर होने के लिए खेद है, लेकिन क्या आप कृपया बता सकते हैं * कथन * क्यों काम करता है? आपने कहा कि 'dirname' निष्पादित फ़ाइल (वर्तमान कार्यशील निर्देशिका के सापेक्ष या पूर्ण) का पथ लौटाता है,' cd' उस निर्देशिका में pwd को बदलता है, और 'pwd' वर्तमान कार्यशील निर्देशिका के पूर्ण पथ को प्रिंट करता है। लेकिन वे '&&' से क्यों जुड़ गए हैं? और 'सीआईआर' विफल होने पर 'डीआईआर 'क्या होगा? – Christian

संबंधित मुद्दे