सोर्सिंग ('।' या 'सोर्स') और बैश में फाइल निष्पादित करने में क्या अंतर है?


76

इस तरह से स्क्रिप्ट निष्पादित करने में क्या अंतर है:

./test.sh

और इस तरह से एक स्क्रिप्ट निष्पादित:

. test.sh?

मैंने यह देखने के लिए एक सरल, दो-लाइन स्क्रिप्ट की कोशिश की कि क्या अंतर होने पर मुझे मिल सकता है:

#!/bin/bash
ls

लेकिन दोनों . test.shऔर ./test.shएक ही जानकारी लौट आए।


माफी अगर यह एक डुप्लिकेट है - तो आगे की जांच पर, मुझे 'बाश' के बजाय 'बैश डॉट' की खोज करके प्रासंगिक जानकारी वाले कुछ पृष्ठ मिले।
नाटन

3
जिस तरह (पहले एक खोज को आमंत्रित करता है ) test.shके समान नहीं है , तो उसी तरह से अलग और अलग हैं (पूर्व एक खोज को आमंत्रित करता है )। पथ खोज करते समय अंत में कई गोले स्पष्ट रूप से शामिल प्रतीत होते हैं , लेकिन यह व्यवहार मानक नहीं है। इस प्रकार, बनाम और बनाम की तुलना करना अधिक सटीक है । ./test.shPATH. test.sh. ./test.shPATH.PATH.test.sh. test.sh./test.sh. ./test.sh
jw013

जवाबों:


83

./test.shtest.shएक अलग कार्यक्रम के रूप में चलाता है । यदि फ़ाइल test.shप्रारंभ होती है , तो यह एक बैश स्क्रिप्ट हो सकती है #!/bin/bash। लेकिन यह पूरी तरह से कुछ और हो सकता है।

. ./test.shtest.shबैश के चल रहे उदाहरण के अंदर फ़ाइल का कोड निष्पादित करता है । यह काम करता है जैसे test.shकि . ./test.shलाइन के बजाय सामग्री फ़ाइल को टेक्स्ट में शामिल किया गया था। (लगभग) कुछ विवरण हैं जो भिन्न हैं, जैसे कि मूल्य $BASH_LINENOऔर returnबिलिन के व्यवहार ।)

source ./test.sh. ./test.shबाश के समान है (अन्य गोले में, sourceथोड़ा अलग हो सकता है या पूरी तरह से मौजूद नहीं है; .समावेश के लिए पोसिक्स में है)।

बिलिन के ./test.shसाथ एक स्क्रिप्ट के साथ और एक अलग स्क्रिप्ट चलाने के बीच सबसे आम तौर पर दिखाई देने वाला अंतर .यह है कि यदि test.shस्क्रिप्ट कुछ पर्यावरण चर सेट करती है, तो एक अलग प्रक्रिया के साथ, केवल बाल प्रक्रिया का वातावरण सेट किया जाता है, जबकि स्क्रिप्ट शामिल करने के साथ, पर्यावरण एकमात्र शेल प्रक्रिया सेट की गई है। आप एक लाइन जोड़ देते हैं तो foo=barमें test.shऔर echo $fooबुला स्क्रिप्ट के अंत में, आप अंतर देखेंगे:

$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo

$ . ./test.sh
$ echo $foo
bar

17
साथ echo $$ही स्क्रिप्ट में जोड़ने से अंतर काफी स्पष्ट दिखाई देगा। $$चर वर्तमान खोल के पीआईडी रखती है।

1
एक अन्य उपयोग परिदृश्य . ./test.shएक अन्य शेल स्क्रिप्ट के भीतर से कॉल का उपयोग उन फ़ंक्शन का उपयोग करने के लिए करता है जो कि test.sh के भीतर वर्णित हैं। मेरा मतलब है, यह केवल चर नहीं हैं जिन्हें आप सेट कर सकते हैं, आप इस तरह से नए फ़ंक्शन भी बना सकते हैं जो बाद में बैश या किसी अन्य स्क्रिप्ट से कॉल करने योग्य हैं। . /usr/libexec/company/tools; custom_command "variable
राकोमी जूल

9

एक स्क्रिप्ट को चलाने का पहला तरीका इसे एक बच्चे की प्रक्रिया के रूप में चलाता है। दूसरी तरफ सोर्सिंग (दूसरा तरीका), स्क्रिप्ट को चलाता है जैसे कि आपने अपने सभी कमांड को वर्तमान शेल में दर्ज किया है - यदि स्क्रिप्ट एक चर सेट करता है, तो यह सेट रहेगा, यदि स्क्रिप्ट बाहर निकलती है, तो आपका सत्र बाहर निकल जाएगा। help .प्रलेखन के लिए देखें ।


3

एक और बात जो मैंने नोट की है कि यदि आपके पास इस तरह का एक उपनाम है:

# add into .bashrc_aliases
alias ls='ls -lht'

साथ ./test.shआप एक सामान्य मिलेगा lsनिर्गम (और वर्तमान खोल तुलना में एक अलग पीआईडी):

auraham@pandora:~/iso$ ./test.sh 
dsl-4.4.10.iso  test.sh
3136 # PID

के साथ . test.shया . ./test.shआपको अधिक विस्तृत आउटपुट मिलेगा (और वर्तमान शेल की तुलना में एक ही पीआईडी):

auraham@pandora:~/iso$ echo $$
2767 # shell PID

auraham@pandora:~/iso$ . test.sh 
total 50M
drwxrwxr-x  2 auraham auraham 4.0K Jul 30 15:41 .
-rwxrwxr-x  1 auraham auraham   32 Jul 30 15:41 test.sh
drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 ..
-rw-rw-r--  1 auraham auraham  50M Jul 28 17:24 dsl-4.4.10.iso
2767 # PID

आप इसे .bashrc if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi तब इसमें शामिल कर सकते हैं , अपने उपनाम रख सकते हैं .bash_aliases
आराहम

बेशक, लेकिन क्या आपको अभी भी aliasकीवर्ड का उपयोग नहीं करना है ? (हो सकता है कि आप सिर्फ एक गलती के बाद - लाइन 3 पर?)
इमानुएल बर्ग

पूरी तरह से सही, मेरी गलती। धन्यवाद
@EmanuelBerg

-1

source(या .) के लिए मेरे लिए मुख्य उपयोग कार्य है

मेरे पास कई कार्यों के साथ स्क्रिप्ट हैं और मैं उन सभी को अपने साथ निष्पादित करता हूं .bashrc। फ़ंक्शंस "बन" आदेश, जो मैं अक्सर उपयोग करता हूं।


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