2012-03-24 10 views
10

में एक शेल स्क्रिप्ट फ़ाइल को सोर्स किया गया है या नहीं, मैं यह निर्धारित करना चाहता हूं कि स्क्रिप्ट फ़ाइल निष्पादित या सोर्स की गई है या नहीं।बैश

उदाहरण के लिए,

# Shell script filename build.sh 
if [ "x$0" = "xbash" ]; then 
    echo "I am sourced by Bash" 
else 
    echo "I am executed by Bash" 
fi 

अगर मैं

source build.sh 

टाइप किया यह उत्पादन मैं बैश द्वारा sourced रहा होगा।

अगर मैं

./build.sh 

टाइप किया यह उत्पादन मैं बैश द्वारा क्रियान्वित कर रहा हूँ जाएगा।

वर्तमान में, मैं ऐसा करने के लिए $ 0 का उपयोग करता हूं। क्या कोई बेहतर विचार है?

#!/bin/bash 

if [ "x$(awk -F/ '{print $NF}' <<< $0)" = 'xcdruntime' ]; then 
    echo Try to source me, not execute me. 
else 
    cd /opt/www/app/pepsi/protected/runtime 
fi 
+0

आपका समाधान काम नहीं करता है, क्योंकि आप 'bash build.sh' के माध्यम से एक स्क्रिप्ट चला सकते हैं। यह भी ध्यान रखें कि एक स्क्रिप्ट स्वयं स्रोत हो सकती है - यह थोड़ी बेवकूफ है, लेकिन संभव है। – user123444555621

+0

@ Pumbaa80 eh ... मैंने 'bash build.sh' का प्रयास किया है मेरा समाधान अभी भी काम करता है – hellojinjie

+0

आह ठीक है, इसे भूल जाओ;) – user123444555621

उत्तर

9

अगर एक और स्क्रिप्ट के द्वारा sourced यह काम नहीं करता है:

Tripeee से प्रेरित होकर, मैं एक बेहतर तरीका मिल गया। मैं दूसरी तरफ जाऊंगा;

test "X$(basename -- "$0")" = "Xbuild.sh" || echo Being sourced 

अद्यतन: जोड़ा एक्स दोनों तार करने के लिए उपसर्ग।

भी अपडेट करें: basename आमंत्रण में डबल डैश जोड़ा गया।

+0

ये, आपका सॉल्यूशन मेरे से बेहतर है। यदि स्क्रिप्ट किसी अन्य स्क्रिप्ट द्वारा सोर्स की जाती है, तो $ 0 'bash' – hellojinjie

+0

नहीं होगा, मुझे यह कहना है कि आपका समाधान सबसे अच्छा नहीं है, यह उबंटू पर ठीक काम करता है, लेकिन यह एंटरप्राइज़ लिनक्स 5 पर विफल रहा। उबंटू पर, जब स्रोत स्क्रिप्ट फ़ाइल, $ 0 'bash' है, जबकि ईएल 5 पर, $ 0' -bash' है। जब बेसनाम मेट-बैश, एक त्रुटि – hellojinjie

+1

ओउप्स होती है, तो आप सही हैं। मेरा जवाब अपडेट किया गया। आपकी प्रतिक्रिया के लिए धन्यवाद। – tripleee