यह रूप क्या है चर = $ (…)


9

निम्नलिखित का क्या मतलब है:

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

मुझे इस हिस्से में दिलचस्पी है

varible=$(...)

मुझे पता है कि कोष्ठक का उपयोग एक उपप्रकार को अंजाम देने के लिए किया जाता है, लेकिन क्या होगा यदि उनका साथ दिया जाए $?


3
यदि आप बैश का उपयोग कर रहे हैं: मैन पेज में देखें man bashऔर कमांड प्रतिस्थापन के लिए खोजें
फ्लो

जवाबों:


16

बैश मैनुअल ( 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%/*}"

धन्यवाद, तो यह मूल रूप से अंतरतम कोष्ठक से पार्स करना शुरू कर देता है, सही है? और उद्धरण का उपयोग क्यों किया जाता है?
मैक्स कोर्सेटस्की

@ मैक्सिमस सही। मैंने आगे की जानकारी के साथ अपना जवाब अपडेट किया है।
Kusalananda

शायद आपको कहना चाहिए "सभी बॉर्न जैसे गोले के लिए सच है"। इस तरह से थोड़ा स्पष्ट
सेर्गेई कोलोडियाज़नी

@ शेर, ध्यान दें कि बॉर्न शेल ( /bin/shसोलारिस 10 या उससे पहले की तरह) ने समर्थन नहीं किया $(...)
स्टीफन चेजलस

@ स्टीफनचेज़ेलस I इसे शामिल करेगा।
Kusalananda

6

यह करने के लिए इसका मतलब है चलाने के अंदर क्या है कोष्ठकों एक में subshell और वापसी है कि एक के रूप में मूल्य , बताए अपने मामले के लिए कि में varible


5

varible=$(..)कहा जाता कमान प्रतिस्थापन और यह के साधन और कुछ नहीं लेकिन एक शेल कमांड चलाने के लिए और एक चर करने के लिए इसके उत्पादन की दुकान या गूंज आदेश का उपयोग कर वापस प्रदर्शित करने के लिए। उदाहरण के लिए, प्रदर्शन तिथि और समय:

echo "Today is $(date)"

और इसे किसी वैरिएबल में स्टोर करने के लिए:

SERVERNAME=$(hostname)

अधिक जानकारी के लिए: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/

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