"উত্স" ব্যবহার করে স্ক্রিপ্টটি চালানোর সময় কীভাবে সঠিকভাবে সেটিংস পুনরুদ্ধার করবেন?


8

আমি একটি স্ক্রিপ্ট লিখছি যা ব্যবহার করে কার্যকর করা দরকার source, কারণ এটির কাজটি পরিবেশ পরিবর্তন করা। স্ক্রিপ্ট চলাকালীন, আমি set -eএমনটি ব্যবহার করতে চাই যাতে কোনও ত্রুটি স্ক্রিপ্ট বন্ধ করে দেয়। স্ক্রিপ্টটি এর মতো দেখাচ্ছে:

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

সমস্যাটি হ'ল set -eস্ক্রিপ্ট শেষ হওয়ার পরে স্বাভাবিকভাবে কার্যকর হয়। আমি কীভাবে নিশ্চিত করতে পারি যে setস্ক্রিপ্টটি বন্ধ হয়ে গেলে (কোনওভাবেই সাফল্যের সাথে সম্পন্ন করে বা ত্রুটির মাধ্যমে) পরিবর্তিত বিকল্পটি তার প্রচলিত মানটিতে সঠিকভাবে পুনরুদ্ধার করা হয়েছে?



উত্তর:


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আপনার বর্তমান সেটআপটি জানার জন্য চালান । আপনার স্ক্রিপ্টগুলিতে সেগুলির কোনও সেট / আনসেট করার সময় সুস্পষ্ট হন।
দাউদ

11

কমান্ডটি 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"

বাশের মধ্যে বেশ কয়েকটি অ-মানক (পসিক্স নয়) বিকল্প রয়েছে যা shoptকমান্ড ব্যবহার করে সামঞ্জস্য করা হয়েছে । কমান্ডটি shopt -pএকই বিকল্পে এই বিকল্পগুলি সংরক্ষণ করতে ব্যবহার করা যেতে পারে।

আপনি যদি কেবল একটি বিকল্প সংরক্ষণ এবং পুনরুদ্ধার করতে চান তবে আপনি environment - পরিবেশের ভেরিয়েবলটি ব্যবহার করতে পারেন, যা বিকল্পগুলির বর্তমান সেটকে অক্ষর হিসাবে তালিকাবদ্ধ করে, যেমন

$ echo $-
himBH

নির্দিষ্ট বিকল্পটি সংরক্ষণ এবং পুনরুদ্ধার করতে আপনি এর মতো কিছু ব্যবহার করতে পারেন:

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

দ্রষ্টব্য যে ইওলাল কলটিতে "$ SAVED_OPTIONS" এর আশেপাশের উদ্ধৃতিগুলি মিস করা খুব গুরুত্বপূর্ণ।
ম্যাট

0

রিটার্ন ট্র্যাপ ব্যবহার করুন

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

0

পূর্ববর্তী সক্রিয় সেটিংসটি পুনরুদ্ধার করা দ্রুত এইভাবে করা যেতে পারে:

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

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

set -$PREV_SETTING

অন্যান্য উপায়ে (অফ স্টেটে পুনরুদ্ধার করুন) আফাইক এমন শর্টকাট নেই এবং সেপ্পোর জবাব সমস্ত কেস জুড়ে।


আপনার কোড লিখিত ফলন হিসাবে -bash: set: -i: invalid optionকারণ -iপতাকাটি একটি ইন্টারেক্টিভ শেল নোট করে।
dpw
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.