शेल में इसका क्या अर्थ है जब हम डॉलर चिह्न और कोष्ठक के अंदर एक कमांड रखते हैं: $ (कमांड)


110

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

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

समान आउटपुट को कोड के निम्नलिखित लाइन से शेल के विभिन्न संस्करण में भी लिया जा सकता है

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

मैं $(cd..और का अर्थ समझने में असमर्थ हूं $(dirname

क्या कोई यह जानने में मेरी मदद कर सकता है कि इस कमांड को कैसे अंजाम दिया जाए?


1
और यहाँ फायदे / नुकसान के बारे में एक सवाल है $()बनाम ``: stackoverflow.com/questions/9449778/…
कोई भी

जवाबों:


115

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


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

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

4
@trysis - कमांड प्रतिस्थापन निश्चित रूप से एक उप-प्रकार में चलता है , और इसलिए यह ध्यान देने योग्य है।
एलिरन मलका

2
मैं समझता हूं कि बैकटिक्स $ () के रूप में एक ही परिणाम का उत्पादन करता है, लेकिन क्या अंतर विशुद्ध रूप से कॉस्मेटिक है? क्या कोई कारण है कि एक के बाद एक का उपयोग किया जा सकता है, इसके अलावा $ () अधिक सुपाठ्य है?
मिशेल ट्रेसी

2
"$ जैसे $ का उपयोग (इको फू) का अर्थ है कि जो कुछ भी उप-भाग में कोष्ठक के अंदर है उसे चलाएं और मान के रूप में लौटाएं।" ... यह भ्रामक है, क्योंकि यह आदेश चलाने की$(echo foo) कोशिश करेगा कि कोष्ठक से क्या लौटा है, यह पहले भागेगा echo fooफिर चलाने की कोशिश करेगा fooजो एक त्रुटि देता है
लेखाकार م

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

क्या कोई यह जानने में मेरी मदद कर सकता है कि इस कमांड को कैसे अंजाम दिया जाए?

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

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

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

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


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

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