किसी अन्य स्क्रिप्ट के लिए स्क्रिप्ट को कॉल करें, लेकिन यदि बच्चा कॉल से बाहर निकलता है तो माता-पिता से बाहर न निकलें


11

first.sh:

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

यदि second.shकोई त्रुटि का पता लगाता है और स्थिति -9 से first.shबाहर निकलता है , तो हमेशा बाहर निकलता है। अगर बच्चा शेल से बाहर निकलता है तो मैं पहले शेल से बाहर निकलने से कैसे बच सकता हूं?

मैं संपादित नहीं कर सकता second.sh


यहां आप .कमांड का उपयोग कर रहे हैं , जो वर्तमान शेल में एक और फाइल का स्रोत है। इसमें कोई चाइल्ड शेल या सबस्क्रिप्शन शामिल नहीं है। क्या आपको निष्पादित करने second.sh और third.shउनके बजाय सोर्सिंग करने का मतलब था?
सेलडा

हाँ .. मुझे इसके बजाय निष्पादन लिखना होगा। ./ मैं "बाहर निकलें $" की उपेक्षा करना चाहते हैं? सेकेंड के अंदर.श .. बिना सेकेंड एड करना संभव है।
user3589887

जवाबों:


13

आप यहां क्या कर रहे हैं, इसमें शामिल है second.shऔर third.shउप-स्क्रिप्ट उसी प्रक्रिया में चल रही है, जिसे शेल प्रोग्रामिंग में "सोर्सिंग" कहा जाता है। . ./second.shमूल रूप second.shसे उस बिंदु के पाठ को शामिल करने के बराबर है । exitआदेश प्रक्रिया से बाहर निकल जाता है, यह बात है कि क्या आप मूल स्क्रिप्ट में या एक sourced लिपि में इसे कहते नहीं करता है।

सब आप क्या करना चाहते में कमांड चलाने है, तो second.shऔर third.shऔर वे का उपयोग करने की जरूरत नहीं है या मूल स्क्रिप्ट से चर और कार्यों को संशोधित, बच्चे प्रक्रियाओं के रूप में इन लिपियों कहते हैं।

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

यदि आपको मूल स्क्रिप्ट से चर और फ़ंक्शन तक पहुंचने के लिए अन्य स्क्रिप्ट की आवश्यकता है, लेकिन उन्हें संशोधित नहीं करते हैं, तो इन स्क्रिप्ट को सब-रील में कॉल करें। सब्सक्रिप्शन अलग-अलग प्रक्रियाएं हैं, इसलिए exitकेवल उन्हें बाहर निकालता है।

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"

आप चर या में परिभाषित कार्यों का उपयोग करने की आवश्यकता है second.shऔर third.shमाता-पिता लिपि में है, तो आप उन्हें सोर्सिंग रखने के लिए की आवश्यकता होगी।

returnBuiltin बाहर निकलता है केवल sourced स्क्रिप्ट और नहीं पूरी प्रक्रिया - उस के साथ एक और स्क्रिप्ट सहित के बीच कुछ अंतर में से एक है .आदेश और माता पिता के स्क्रिप्ट में अपने पाठ भी शामिल है। Sourced स्क्रिप्ट केवल कॉल करते हैं exitउच्चस्तरीय पर, के रूप में अंदर कार्यों का विरोध किया, तो आप बदल सकते हैं exitमें return। आप एक उपनाम का उपयोग करके स्क्रिप्ट को संशोधित किए बिना कर सकते हैं।

#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"

अगर exitइसे अंदर के कार्यों के लिए भी कहा जाता है, तो मुझे नहीं लगता कि कोई गैर-बोझिल तरीका है। एक बोझिल तरीका एक निकास जाल सेट करना और अपना कोड वहां रखना है।

#!/bin/ksh
do_first () {
  echo "prova"
  trap "after_second" EXIT
  . ./second.sh
  after_second
}
after_second () {
  echo "ho lanciato il secondo"
  trap "after_third" EXIT
  . ./third.sh
  after_third
}
after_third () {
  trap - EXIT
  echo "ho lanciato il terzo"
}
do_first

यह इस कारण से है कि मैंने 'का उपयोग करना बंद कर दिया है।' फ़ाइलों को एक स्क्रिप्ट में स्रोत के लिए, और इसके बजाय विशेष रूप से 'स्रोत' का उपयोग करने का प्रयास करें। IMO जिसे एक बैश 'सर्वोत्तम अभ्यास' माना जाना चाहिए, क्योंकि यह बहुत स्पष्ट करता है कि आपका कोड क्या कर रहा है।
मार्क ई। हैमिल्टन

6

दूसरे और तीसरे शेल को सोर्स करने के बजाय, उन्हें किसी अन्य कमांड की तरह ही चलाएं। निकास कोड को स्टोर किया जा सकता है और उपयोग किया जा सकता है, यदि आपको आवश्यकता हो, जैसे:

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...

STATUS1=$?पहले जारी किए गए इको कमांड के परिणाम को पकड़ लेगा, जिसके परिणाम से स्वतंत्र है ./second.sh
Cromax

@ सामान आप पूरी तरह से सही हैं। उत्तर संपादित किया गया है।
डेल एंडरसन

0

इसे इस तरह आज़माएं ( .कॉल करने पर पहले निकालें second.sh):

first.sh:

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

ऐसा इसलिए है क्योंकि .शोर्ट है sourceजिसके कारण दूसरी स्क्रिप्ट को पहले भाग के रूप में शामिल किया जाना है।

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