./Bla.sh बनाम के साथ एक स्क्रिप्ट को कॉल करना। bla.sh


11

क्या कोई मुझे समझा सकता है कि शेल दो उदाहरणों ए) और बी) के नीचे क्या करता है? यह स्पष्ट रूप से अलग तरह से व्यवहार करता है, लेकिन मुझे पता नहीं चल सकता है कि आउटपुट अलग क्यों है।

उदाहरण:
चलो हमारे वर्तमान निर्देशिका bla.shमें केवल एक कमांड के साथ एक स्क्रिप्ट है :
echo ${0##/*} hello

ए) के
रूप में शुरू: ./bla.sh
देता है:./bla.sh hello

बी) के
रूप में शुरू: . bla.sh
देता है:-bash hello

चूंकि मैं इसे एक स्क्रिप्ट में उपयोग करता हूं, इसलिए दूसरा आउटपुट (-bash के सामने "-" कमांड को मारता है)। बेशक, मदद करने --से पहले एक सरल ${...}, लेकिन मुझे यह समझना अच्छा लगेगा कि पहली जगह में आउटपुट का क्या कारण है।
मुझे बैश पसंद है। और vi [एम]। लेकिन मैं पीछे हटा…

जवाबों:


22
./bla.sh

इधर, आदेश है ./bla.sh। यह शेल bla.shको वर्तमान निर्देशिका में एक निष्पादन योग्य नाम के लिए बनाता है , फिर कर्नेल को शेल से अलग प्रक्रिया में इसे एक सामान्य प्रोग्राम के रूप में चलाने के लिए कहें। (यह bla.shएक bashस्क्रिप्ट, perlया pythonएक, या एक संकलित बाइनरी है, तो कोई फर्क नहीं पड़ता ।)


. bla.sh

यहाँ, कमांड .(उर्फ source) है, आपके शेल का बिल्ट-इन कमांड है। यह शेल bla.shको सिस्टम पथ ($ PATH) नामक फ़ाइल के लिए देखता है और सामग्री की व्याख्या करता है जैसे कि वे आपके द्वारा टाइप की गई हों; यह सब शेल के रूप में एक ही प्रक्रिया में किया जाता है (और इसलिए शेल की आंतरिक स्थिति को प्रभावित कर सकता है)।

यह निश्चित रूप से केवल तब काम करता है जब शेल के bla.shलिए कमांड होते हैं bash(यदि वह वर्तमान में आप उपयोग कर रहे हैं), यह perlस्क्रिप्ट या कुछ और के लिए काम नहीं करेगा ।

(यह help .और help sourceभी समझाया गया है।)


जैसा कि .और ./पूरी तरह से अलग चीजें हैं (एक मार्ग के एक कमांड बनाम भाग), उन्हें संयुक्त रूप से किया जा सकता है - वर्तमान निर्देशिका में . ./bla.shएक फ़ाइल "स्रोत" का उपयोग करेगा bla.sh


आमतौर पर ./bla.shविधि का उपयोग करना सबसे अच्छा है । केवल ~/.bashrc, ~/.profileऔर ऐसी फाइलें आमतौर पर खट्टी होती हैं, क्योंकि वे वर्तमान वातावरण को संशोधित करने वाली होती हैं।


3
इसके अलावा, यदि आप bla.sh में बैश वातावरण बदलते हैं, तो इन परिवर्तनों को ध्यान में रखा जाता है। bla.sh लेकिन बाद नहीं ।/bla.sh यह है क्योंकि । bla.sh वर्तमान बैश के संदर्भ में चलता है जबकि /। bla.sh एक उपप्रकार के रूप में चलता है।
मौवीसील

1
कुछ उदाहरणों के लिए mywiki.wooledge.org/BashFAQ/060 भी देखें । ध्यान दें कि इसके sourceलिए एक bash उपनाम है ., इसके विपरीत sourceनहीं और अन्य गोले में काम नहीं करेगा।
mrucci

7

./<cmd><cmd>एक नई (forked) प्रक्रिया में वर्तमान निर्देशिका में रहने वाले प्रोग्राम को निष्पादित करेगा । इसे अमल में लाना है। और पठनीय भी इसके साथ शुरू होता है #!

. <cmd>आपके वर्तमान शेल को शेल स्क्रिप्ट को निष्पादित करेगा <cmd>जो आपके $PATHया वर्तमान निर्देशिका में वर्तमान शेल प्रक्रिया में रहता है। इसे पठनीय बनाना होगा। यह शेल कमांड के लिए एक उपनाम है source


-1 . <cmd>में कार्यक्रम की तलाश करेंगे $PATHऔर अगर यह नहीं मिला तो यह वर्तमान निर्देशिका में दिखेगा।
कुत्ते की

@dogbane राइट, मैंने इसे सही किया।
किमीकप्लान

FWIW, सभी गोले खट्टे sripts के लिए cwd खोज नहीं करेंगे। zsh (मेरे पास कम से कम विन्यास के साथ) की आवश्यकता है. ./cmd
bstpierre

1
@bstpierre यह एक चलता हुआ मैदान है। POSIX संदर्भ मैंने कहा है कि "शेल PATH द्वारा निर्दिष्ट खोज पथ का उपयोग करेगा" और "कुछ पुराने कार्यान्वयन ने फ़ाइल के लिए वर्तमान निर्देशिका की खोज की, भले ही PATH का मान इसे अस्वीकृत कर दिया हो।"
किमीकपलन

1

./cmd./निष्पादन योग्य के लिए स्पष्ट पथ ( - वर्तमान dir) का उपयोग करता है । और यह जरूरी नहीं है कि यह इसके साथ शुरू हो #!

. cmd- (उर्फ source) - बैश बिलियन कमांड। के माध्यम से निष्पादित करने का एक दृश्य अंतर sourceयह है कि यह वर्तमान शेल के पर्यावरण चर को सेट / संशोधित कर सकता है।


अधिक सटीक, sourceएक बैश-केवल उपनाम है .(जो मानक है)
user1686

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