बैश: स्क्रिप्ट में स्रोत बनाम निष्पादन का पता लगाएं?


19

मेरे पास एक स्क्रिप्ट है जो मेरे फाइल सिस्टम (एक बिल्ड प्रक्रिया के साइड इफेक्ट) के आसपास लिट गई है जो कुछ वैश्विक पर्यावरण चर (LD_LIBRARY_PATH, PATH, ROOTDIR, आदि) को सेट करती है, जिन्हें उचित संचालन के लिए मेरे शेल में होना चाहिए। बेशक, इसका मतलब है कि मुझे इसे काम करने के लिए source script.shया . script.shइसे प्राप्त करने की आवश्यकता है , और नहीं ./script.sh(जो एक नए शेल को खोल देगा और मेरे वर्तमान शेल में चर सेट नहीं करेगा)।

क्या कोई ऐसी चीज है जिसे मैं स्क्रिप्ट में जोड़ सकता हूं (या किसी को दौड़ने से रोकने के लिए ) ./script.sh?

जवाबों:


15

एक शेल स्क्रिप्ट में, $0वर्तमान में चल रही स्क्रिप्ट का नाम है। आप इसका उपयोग यह बताने के लिए कर सकते हैं कि क्या आप खट्टे हो रहे हैं या इस तरह से चल रहे हैं:

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi

5

सबसे सरल तरीका bashहै:

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE हमेशा स्क्रिप्ट का नाम / पथ होता है।

$0 केवल स्क्रिप्ट का नाम / पथ सम्‍मिलित नहीं होने पर।

इसलिए जब वे मेल खाते हैं, तो इसका मतलब है कि स्क्रिप्ट में खटास नहीं थी।


1

इस पर एसओ से चर्चा की गई है@Barroyo द्वारा सबसे upvoted जवाब उपयोग करने के लिए कहते हैं

[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."

@will: मैनुअल कहता है: एक सरणी चर जिसके सदस्य स्रोत फ़ाइलनाम हैं जहाँ FUNCNAME सरणी चर में संबंधित शेल फ़ंक्शन नाम परिभाषित किए गए हैं। कैसे एक समारोह?
सर्व-इंक

1

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


1
यह अधूरा है। स्क्रिप्ट bash scriptपर अमल ध्वज की परवाह किए बिना आप अभी भी स्क्रिप्ट चला सकते हैं । साइग्विन के तहत भी (यह गिनती करता है?) आप झंडे निष्पादित नहीं कर सकते।
टीनो

0

उदाहरण के लिए .sh .src से एक्सटेंशन बदलने के लिए $ 0 ( मिकेल उत्तर) की जाँच उपयोगी हो सकती है। यह किसी को भी समझने में मदद करेगा जिसे इस स्क्रिप्ट को निष्पादित नहीं करना चाहिए।


0

एक कस्टम दुभाषिया बनाएँ source_reminder:

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

यह निष्पादन योग्य बनाने के लिए मत भूलना। तो बस इसे अपनी स्क्रिप्ट में उपयोग करें:

#!/path/to/your/source_reminder
foo
bar
whatever

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


अच्छा पकड़ा। #!/bin/echo do not executeया #!/bin/falseया #!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }। हालाँकि यह उस मामले को नहीं पकड़ता है जहाँ स्क्रिप्ट को कुछ sh scriptइस तरह निष्पादित किया जाता है (जैसा कि यह शेबंग को अनदेखा करता है)।
टीनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.