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




bash shell (3)

मैं इस प्रीइंस्ट फ़ाइल की सामग्री का अध्ययन कर रहा हूं कि स्क्रिप्ट को उस पैकेज से पहले निष्पादित किया जाता है, जिसे इसके डेबियन संग्रह (.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 मतलब है कि "त्रुटि" के साथ समाप्त होता है, है ना?)।

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

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


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


गुगलिंग के दौरान मुझे यह प्रश्न मिला, यह पता लगाने की कोशिश कर रहा था कि 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

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 देखें





sh