मैं टर्मिनल में बैश स्क्रिप्ट सोर्स कर रहा हूं , इसलिए त्रुटि के साथ बाहर निकल रहा हूं
set -o errexit
मेरे टर्मिनल को मारता है, जो पूरी तरह से बंद है, क्योंकि मुझे टर्मिनल बंद करना है, एक और खोलना है, और कुछ चर रीसेट करना है।
अब तक, का उपयोग कर
command || return
लाइनों, स्क्रिप्ट में, मैं जो चाहता हूं वही कर रहा हूं
set -o errexit
करने के लिए ... लेकिन मैं इसे पूरी स्क्रिप्ट के लिए करना चाहता हूं; सिर्फ एक लाइन / कमांड नहीं
मेरे पास एक साइट स्थापित करने के लिए आदेशों से भरा एक फ़ाइल है, और मैं इसके बजाय कमांड नहीं करूँगा || वापसी
फ़ाइल में हर एक पंक्ति के लिए
क्या दूसरा सेट विकल्प है, या कुछ और है जो टर्मिनल से बाहर निकलने के बजाय सिर्फ "वापसी" करेगा?
- स्पष्टता के लिए , मैं स्क्रिप्ट को मारना चाहूंगा, और टर्मिनल को उसी स्थिति में छोड़ दूंगा, जो टर्मिनल में चल रही सेवा को मारने के लिए ctrl + C दबाएगा। command || returnक्या वो। लेकिन मैं || returnफ़ाइल में हर पंक्ति से निपटना नहीं चाहता । तो मैं कुछ इसी तरह की तलाश कर रहा हूं set -o errexit, जिससे टर्मिनल बंद न हो
--- नोट: इसमें दो पंक्तियों के साथ एक डंब स्क्रिप्ट बनाना (सुपर.श):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
और set -o errexitcreate.sh के शीर्ष पर रखते हुए,
ठीक वैसा ही काम करता है जैसा मैं उम्मीद करता हूं। हालाँकि, यह वास्तव में बेवकूफ है कि इसमें दो पंक्तियों के साथ एक फ़ाइल बनाई जाए, बस एक और बैश स्क्रिप्ट को कॉल करने के लिए, बजाय इसे टर्मिनल से कॉल करने के। Ugghhh
यहाँ कुछ उदाहरण हैं:
सुपर में
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
create.sh में
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
टर्मिनल में:
$ bash super.sh
उम्मीद के मुताबिक उत्पादन:
my-mac$
यह काम। क्या कष्टप्रद समाधान है।
मैं , आदर्श रूप से निष्पादित करना चाहता हूं कि टर्मिनल से बेवकूफ सुपर.श फ़ाइल में क्या है, सुपर.श फ़ाइल नहीं: डी, मेरे बिना टर्मिनल बंद होने के बिना। यह वही है जो मैं करने की कोशिश कर रहा हूं:
टर्मिनल कमांड:
my-mac$ source $create_path blah
create.sh में मेरे पास अभी भी है set -o errexit
यहाँ टर्मिनल पर आउटपुट है
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
और फिर टर्मिनल जम गया है। Ctrl + C काम नहीं करता है, न ही Ctrl + D
अगर इसके बजाय set -o errexit, अगर मैं command || returncreate.sh फ़ाइल में हर जगह केवल स्टेटमेंट्स का उपयोग करता हूं, तो मुझे सीधे वही मिलता है जो मैं चाहता हूं, जबकि सीधे टर्मिनल पर supser.sh में लाइनों को निष्पादित करता है (टर्मिनल से सुपर.श को कॉल करने के बजाय)। लेकिन यह एक व्यावहारिक समाधान भी नहीं है।
नोट: मुझे @terdon का उत्तर सिर्फ एक बच्चे के खोल को पैदा करने के बारे में पसंद आया इसलिए मैंने टर्मिनल के बजाय स्क्रिप्ट के माध्यम से एक उप शेल को समाप्त कर दिया, जैसा कि उसने अपने उत्तर में ब्रेसिज़ का उपयोग करके दिखाया ( ), पूरी स्क्रिप्ट के आसपास .. उसका उत्तर काम भी करता है।
source $file_path argumentस्क्रिप्ट को उसी शेल में निष्पादित किया जा रहा है जिसे मैंने इसे कॉल किया था (क्या sourceकरता है, मुझे बताया गया है ... और इस तरह काम करता है) command || returnस्टेटमेंट फाइल में हैं जिसे मैं टर्मिनल में निष्पादित कर रहा हूं