"स्रोत" का उपयोग करके स्क्रिप्ट चलाते समय सेटिंग्स को ठीक से कैसे पुनर्स्थापित करें?


9

मैं एक स्क्रिप्ट लिख रहा हूं source, जिसका उपयोग करके निष्पादित करने की आवश्यकता है , क्योंकि इसका कार्य पर्यावरण को संशोधित करना है। स्क्रिप्ट के दौरान, मैं उपयोग करना चाहता हूं set -eताकि कोई भी त्रुटि स्क्रिप्ट को रोक दे। स्क्रिप्ट इस प्रकार है:

#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript

समस्या यह है कि set -eस्क्रिप्ट खत्म होने के बाद स्वाभाविक रूप से प्रभाव में रहता है। मैं यह कैसे सुनिश्चित कर सकता हूं कि setजब स्क्रिप्ट बंद हो जाती है (किसी भी तरह से - सफलतापूर्वक पूरा करके या किसी त्रुटि पर) तो परिवर्तित विकल्प को इसके प्रचलित मूल्य पर ठीक से रखा जा सकता है?



एक ही मुद्दा ( -x/ xtraceविकल्प के लिए) इको कमांड के लिए सप्रेस एक्ज़ीक्यूट ट्रेस
स्कॉट

जवाबों:


3

ठीक उसी तरह से जैसे आप इसे सक्रिय करते हैं: बिटिन को कॉल करना set:

$ set -o errexit
$ set -o | grep errexit
errexit         on
$ set +o errexit
$ set -o | grep errexit
errexit         off

इस bash(1)मेन्यू से, SHELL BUILTIN COMMANDSसेक्शन के तहत , `सेट 'कमांड:

-o option-name
The option-name can be one of the following:
    errexit Same as -e.

3
क्या कोई तरीका है कि इन सेटिंग्स को कैसे बचाया जाए और बाद में उन्हें पुनर्स्थापित किया जाए?
पेट्र पुडल्क

set -oअपना वर्तमान सेटअप ज्ञात करने के लिए चलाएँ । अपनी स्क्रिप्ट पर उनमें से किसी को सेट / अनसेट करते समय स्पष्ट रहें।
दाऊद

13

आदेश set +oवर्तमान सेटिंग्स को कमांड के रूप में सूचीबद्ध करता है जो उसी राज्य को पुनर्स्थापित करता है, जैसे

$ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
...

यदि आप इस आउटपुट को शेल चर में सहेजते हैं, तो आप बाद में सभी विकल्पों को आसानी से बहाल कर सकते हैं:

SAVED_OPTIONS=$(set +o)
set -e
# do something
eval "$SAVED_OPTIONS"

बैश में कई गैर-मानक (POSIX नहीं) विकल्प भी शामिल हैं जिन्हें shoptकमांड का उपयोग करके समायोजित किया जाता है । shopt -pइन विकल्पों को समान रूप से सहेजने के लिए कमांड का उपयोग किया जा सकता है।

यदि आप केवल एक विकल्प को सहेजना और पुनर्स्थापित करना चाहते हैं, तो आप $ - पर्यावरण चर का उपयोग कर सकते हैं, जो विकल्पों के मौजूदा सेट को अक्षरों के रूप में सूचीबद्ध करता है।

$ echo $-
himBH

किसी विशेष विकल्प को बचाने और पुनर्स्थापित करने के लिए आप कुछ इस तरह का उपयोग कर सकते हैं:

[[ $- = *e* ]]
SAVED_ERREXIT=$?
set -e
# do something
(( $SAVED_ERREXIT )) && set +e

ध्यान दें कि यह बहुत महत्वपूर्ण है कि "कॉल SAVED_OPTIONS" के आसपास के उद्धरणों को याद न रखें।
मैट

3

एक RETURN जाल का उपयोग करें

RETURN जालियां लिपटी स्क्रिप्ट के लिए भी काम करती हैं।

RETURNशेल फ़ंक्शन .या sourceरिटर्न के साथ निष्पादित शेल स्क्रिप्ट के बाद निष्पादन शुरू होने से पहले एक जाल के साथ निर्दिष्ट कमांड निष्पादित किए जाते हैं ।

- https://www.gnu.org/software/bash/manual/bash.html

main_script.sh

#!/usr/bin/env bash
echo "inside main script"
shopt -o errexit
source a_script_to_be_sourced.sh
echo "back inside main script"
shopt -o errexit

a_script_to_be_sourced.sh

trap "$(shopt -p -o errexit)" RETURN
set -e # Equivalents: set -o errexit; shopt -s -o errexit
echo "inside sourced script"
shopt -o errexit

परीक्षा

$ ./main_script.sh 
inside main script
errexit         off
inside sourced script
errexit         on
back inside main script
errexit         off

2

पिछली सक्रिय सेटिंग्स को पुनर्स्थापित करना जल्दी से किया जा सकता है:

PREV_SETTING=$-  # e.g. himxBH  (there was xtrace)

set +x
# do your script without xtrace, ...

set -$PREV_SETTING

अन्य तरीके से (ऑफ स्टेट को पुनर्स्थापित करें) AFAIK ऐसा कोई शॉर्टकट नहीं है और सेप्पो का जवाब सभी मामलों को कवर करता है।


आपका कोड लिखित पैदावार के रूप में है -bash: set: -i: invalid optionक्योंकि -iझंडा एक इंटरैक्टिव शेल नोट करता है।
dpw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.