linux बैश स्क्रिप्ट में सेट-का क्या मतलब है?




bash shell (4)

गुगलिंग के दौरान मुझे यह प्रश्न मिला, यह पता लगाने की कोशिश कर रहा था कि set -e कारण छोड़ी गई एक स्क्रिप्ट के लिए बाहर निकलने की स्थिति क्या थी। जवाब मेरे लिए स्पष्ट नहीं दिखाई दिया; इसलिए यह जवाब। असल में, set -e ए कमांड के निष्पादन को रोकता है (उदाहरण के लिए एक शेल स्क्रिप्ट) और विफल होने वाले कमांड का एक्ज़िट स्टेटस कोड देता है (यानी आंतरिक स्क्रिप्ट, बाहरी स्क्रिप्ट नहीं)

उदाहरण के लिए, मान लें कि मेरे पास एक शेल स्क्रिप्ट है outer-test.sh :

#!/bin/sh
set -e
./inner-test.sh
exit 62;

inner-test.sh के लिए कोड है:

#!/bin/sh
exit 26;

जब मैं कमांड लाइन से outer-script.sh चलाता outer-script.sh मेरी बाहरी स्क्रिप्ट आंतरिक स्क्रिप्ट के निकास कोड के साथ समाप्त हो जाती है:

$ ./outer-test.sh
$ echo $?
26

मैं इस प्रीइंस्ट फ़ाइल की सामग्री का अध्ययन कर रहा हूं कि स्क्रिप्ट को उस पैकेज से पहले निष्पादित किया जाता है, जिसे इसके डेबियन संग्रह (.deb) फ़ाइल से अनपॅक किया जाता है।

लिपि में निम्नलिखित कोड है:

#!/bin/bash
set -e
# Automatically added by dh_installinit
if [ "$1" = install ]; then
   if [ -d /usr/share/MyApplicationName ]; then
     echo "MyApplicationName is just installed"
     return 1
   fi
   rm -Rf $HOME/.config/nautilus-actions/nautilus-actions.conf
   rm -Rf $HOME/.local/share/file-manager/actions/*
fi
# End automatically added section

मेरी पहली क्वेरी लाइन के बारे में है:

set -e

मुझे लगता है कि बाकी की लिपि बहुत सरल है: यह जांचता है कि डेबियन / उबंटू पैकेज मैनेजर एक इंस्टॉलेशन ऑपरेशन निष्पादित कर रहा है या नहीं। यदि ऐसा है, तो यह जांचता है कि मेरा एप्लिकेशन अभी सिस्टम पर स्थापित है या नहीं। यदि यह है, तो स्क्रिप्ट "MyAplicationName बस स्थापित है" संदेश प्रिंट करता है और समाप्त होता है ( return 1 मतलब है कि "त्रुटि" के साथ समाप्त होता है, है ना?)।

यदि उपयोगकर्ता मेरे पैकेज को स्थापित करने के लिए डेबियन / उबंटू पैकेज सिस्टम से पूछ रहा है, तो स्क्रिप्ट भी दो निर्देशिकाओं को हटा देती है।

क्या यह सही है या क्या मुझे कुछ याद आ रहा है?


help set :

  -e  Exit immediately if a command exits with a non-zero status.

लेकिन यह बहुत विश्वसनीय नहीं है और एक बुरा अभ्यास के रूप में माना जाता है, बेहतर उपयोग:

trap 'do_something' ERR

त्रुटियों के दौरान do_something फ़ंक्शन चलाने के लिए।

http://mywiki.wooledge.org/BashFAQ/105 देखें


बैश के अनुसार - सेट errexit मैनुअल, अगर -e / errexit सेट है, तो एक pipeline में एक साधारण कमांड , एक सूची या कंपाउंड कमांड एक गैर-शून्य स्थिति देता है, तो खोल तुरंत बाहर निकलता है।

डिफ़ॉल्ट रूप से, पाइपलाइन की निकास स्थिति पाइपलाइन में अंतिम कमांड की निकास स्थिति होती है, जब तक कि pipefail विकल्प सक्षम नहीं होता है (यह डिफ़ॉल्ट रूप से अक्षम होता है)।

यदि ऐसा है, तो गैर-शून्य स्थिति से बाहर निकलने के लिए अंतिम (दाएं) कमांड की पाइपलाइन की वापसी स्थिति, या शून्य अगर सभी आदेश सफलतापूर्वक बाहर निकलें।

अगर आप बाहर निकलने पर कुछ निष्पादित करना चाहते हैं, तो trap को परिभाषित करने का प्रयास करें, उदाहरण के लिए:

trap onexit EXIT

जहां onexit बाहर निकलने पर कुछ करने के लिए आपका काम है, जैसे नीचे सरल स्टैक ट्रेस प्रिंट कर रहा है:

onexit(){ while caller $((n++)); do :; done; }

इसी तरह का विकल्प -E/errtrace जो इसके बजाय -E/errtrace पर जाल करेगा, उदाहरण के लिए:

trap onerr ERR

उदाहरण

शून्य स्थिति उदाहरण:

$ true; echo $?
0

गैर-शून्य स्थिति उदाहरण:

$ false; echo $?
1

नकारात्मक स्थिति उदाहरण:

$ ! false; echo $?
0
$ false || true; echo $?
0

pipefail अक्षम होने के साथ परीक्षण:

$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1

pipefail सक्षम होने के साथ परीक्षण:

$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1

अगर कोई कमांड या पाइपलाइन में कोई त्रुटि होती है तो set -e ए स्क्रिप्ट के निष्पादन को रोकता है - जो कि डिफ़ॉल्ट शेल व्यवहार के विपरीत है, जो स्क्रिप्ट में त्रुटियों को अनदेखा करना है। इस अंतर्निहित कमांड के लिए दस्तावेज़ देखने के लिए टर्मिनल में help set टाइप करें।





sh