शेल में कमांड से पहले डॉट का क्या अर्थ है?


74

एंड्रॉइड ग्रहण डिबग ट्यूटोरियल का पालन करते समय, मैं कमांड का पालन करता हूं।

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

मेरी समस्या क्या build/envsetup.shमतलब से पहले डॉट है?

जवाबों:


78

उस संदर्भ में एक डॉट का अर्थ है कि उस फ़ाइल की सामग्री को वर्तमान शेल में "स्रोत" करना। साथ sourceही एक खोल builtin आदेश किया जा रहा है। और sourceऔर डॉट ऑपरेटर पर्यायवाची हैं।

उदाहरण

कहो कि मेरे पास sample.shफ़ाइल में निम्नलिखित सामग्री थी ।

$ cat sample.sh 
echo "hi"
echo "bye?"

अब जब मैं इसे स्रोत:

$ . sample.sh 
hi
bye?
$

इस तरह की फाइलें अक्सर सेटअप कमांड को शामिल करने के लिए उपयोग की जाती हैं जैसे कि चीजों को पर्यावरण चर में जोड़ना।

उदाहरण

, मैं एक फ़ाइल में इन आदेशों था कहो addvars.sh

$ cat addvars.sh 
export VAR1="some var1 string"
export VAR2="some var2 string"

ध्यान दें कि मेरे वर्तमान शेल के वातावरण में मेरा कोई चर नहीं है।

$ env | grep VAR
$

अब जब मैं इस फ़ाइल को स्रोत:

$ . addvars.sh 
$

ठीक है, ऐसा नहीं लगता कि यह कुछ भी किया था, लेकिन जब हम envचर को फिर से जाँचते हैं :

$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string

70

स्लम के उत्तर में जोड़ने के लिए:

शेल स्क्रिप्ट को चलाने के दो तरीके हैं। एक स्क्रिप्ट को एक अलग प्रक्रिया में चलाना है, जिसका अर्थ है शेल के पर्यावरण (मेमोरी स्टेट) के बारे में कुछ भी "चाइल्ड" शेल प्रक्रिया को चलाने से पहले "पैरेंट" शेल की स्थिति पर वापस आ जाएगा।

उदाहरण के लिए, वर्तमान कार्य निर्देशिका (फाइलसिस्टम एक में स्थित है) प्रति-प्रक्रिया के आधार पर निर्धारित की जाती है। तो, चलो एक स्क्रिप्ट है जो इस तरह दिखता है:

#!/bin/bash
cd ~
cd ..
pwd

तो, चलो इस स्क्रिप्ट को कहते हैं, ओह foo,। और इस स्क्रिप्ट को निम्नानुसार चलाते हैं:./foo

हम निम्नलिखित देखेंगे:

/home

(मानक अस्वीकरण है कि बड़ी संख्या में लिनक्स और अन्य UNIX क्लोन वितरण हैं, जिनमें से कुछ उपयोगकर्ता के उपयोगकर्ता निर्देशिकाओं में नहीं हैं /home। या, जैसा कि हम कहते थे कि "आपका लाभ भिन्न हो सकता है")

अब इस स्क्रिप्ट को चलाने के बाद, इस कमांड में टाइप करते हैं

pwd

यह देखने के लिए कि हम किस निर्देशिका में हैं। हम कुछ इस तरह देखेंगे:

/home/username

कारण, फिर से, जिस शेल स्क्रिप्ट को हमने चलाया था, उसका अपना वातावरण था (अपनी स्वयं की निर्देशिका सहित जहां कमांड चलाए जा रहे थे), और स्क्रिप्ट के समाप्त होते ही वह वातावरण चला गया।

अब, fooस्क्रिप्ट को इस तरह चलाते हैं

. ./foo

या, समकक्ष:

source ./foo

यदि हम pwdबाद में करते हैं, तो हम इसे देखेंगे:

/home

इसका कारण: एक स्क्रिप्ट को सोर्स करना एक अलग प्रक्रिया नहीं कहलाता है। यह हाथ से पैरेंट प्रक्रिया में सभी कमांड टाइप करने जैसा है; स्क्रिप्ट समाप्त होने के बाद इसका वातावरण संरक्षित है।


मुझे एक सरल उदाहरण के साथ आना है। आइए एक स्क्रिप्ट है जो इस तरह दिखता है:

#!/bin/bash
exit

नाम बताइए foo। आइए सुनिश्चित करें कि हम इसे चला सकते हैं chmod 755 foo:। तो, चलो इसे इस तरह चलाते हैं:

./foo

कुछ नहीं हुआ। हालांकि, दूसरी तरफ, अगर हम ऐसा करते हैं:

. ./foo

या यह:

source ./foo

हम लॉग आउट करते हैं।


6
आपका उत्तर स्वीकार किए गए से बेहतर है, मैं समझ गया कि आपने कैसे समझाया, धन्यवाद!
अहमद

5

पीरियड (डॉट) में निर्मित बैश के लिए छोटा हाथ है source। यह वर्तमान वातावरण में एक फ़ाइल से कमांडों को पढ़ेगा और निष्पादित करेगा और निष्पादित अंतिम कमांड की निकास स्थिति को लौटाएगा। फाइलें वर्तमान निर्देशिका में या कहीं भी हो सकती हैं PATH। इसे निष्पादित करने की आवश्यकता नहीं है।


1

कैसे पता करें।

# type .
. is a shell builtin

# help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

मुझे लगता है कि मैनुअल में एक अल्पविराम गायब है। यह कहना चाहिए "मौजूदा शेल में एक फ़ाइल से आदेश निष्पादित करें।"
ctrl-alt-delor-

1

। (स्रोत या डॉट ऑपरेटर)
वर्तमान शेल संदर्भ में फ़ाइल नाम तर्क से आदेशों को पढ़ें और निष्पादित करें।

Syntax
      . filename [arguments]

      source filename [arguments]

source डॉट / पीरियड का एक पर्याय है। '' बैश में, लेकिन POSIX श में नहीं, इसलिए अधिकतम अनुकूलता के लिए अवधि का उपयोग करें।

जब कोई स्क्रिप्ट स्रोत का उपयोग करके चलाई जाती है, तो वह मौजूदा शेल के भीतर चलती है, स्क्रिप्ट द्वारा बनाया या संशोधित किया गया कोई भी स्क्रिप्ट पूरी होने के बाद उपलब्ध रहेगा। इसके विपरीत यदि स्क्रिप्ट केवल फ़ाइल नाम के रूप में चलाई जाती है, तो स्क्रिप्ट को चलाने के लिए एक अलग सबशेल (चर के पूरी तरह से अलग सेट) के साथ चलाया जाएगा।

.Ss64script (dot ss64script) और चलाकर स्क्रिप्ट को निष्पादित करने के बीच एक सूक्ष्म अंतर है। ss64script (डॉट स्पेस ss64script)

पहले एक फाइल चल रही है, जिसे 'ls' कमांड से छिपाया गया है, (हालांकि ls -a छिपी हुई फाइलें दिखाएगा) दूसरा विकल्प ss64script को निष्पादित करेगा, भले ही वह chmod के साथ निष्पादन योग्य के रूप में सेट नहीं किया गया हो।

स्रोत


0

टी एल; डॉ

डॉट सोर्स कमांड के समान ही है।

स्रोत एक यूनिक्स कमांड है जो कमांड के अनुसरण में फाइल का मूल्यांकन करता है, कमांड की सूची के रूप में, वर्तमान संदर्भ में निष्पादित किया जाता है।

Https://en.wikipedia.org/wiki/Source_(command) से निकाला गया


2
U & L में आपका स्वागत है! यह उत्तर उन सूचनाओं को डुप्लिकेट करता है जो पहले से ही स्वीकृत उत्तर में हैं , और वास्तव में कुछ भी नहीं जोड़ता है।
जिगलीनाग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.