बैश स्क्रिप्ट से बाहर निकलने से पहले कमांड कैसे चलाएं?


119

यदि एक बैश स्क्रिप्ट में है set -e, और स्क्रिप्ट में एक कमांड त्रुटि देता है, तो स्क्रिप्ट से बाहर निकलने से पहले मैं कुछ सफाई कैसे कर सकता हूं?

उदाहरण के लिए:

#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo

मैं यह कैसे सुनिश्चित कर सकता हूं कि /tmp/fooहटा दिया गया है, भले ही आदेशों में से एक ... do stuff ...विफल हो?

जवाबों:


193

यहाँ जाल का उपयोग करने का एक उदाहरण है:

#!/bin/bash -e

function cleanup {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

आउटपुट:

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $

ध्यान दें कि भले ही asdffdsa लाइन विफल रही हो, फिर भी क्लीनअप निष्पादित किया गया था।


11

से bashमैनपेज (विषय में builtins):

trap [-lp] [[arg] sigspec ...]
कमांड arg को तब पढ़ा और निष्पादित किया जाता है जब शेल सिग्नल प्राप्त करता है।

इसलिए, जैसा कि एनॉन के जवाब में संकेत दिया गया है , trapस्क्रिप्ट में जल्दी से उस हैंडलर को सेट करें जिसे आप ईआरआर पर इच्छा रखते हैं।


help trapअंतर्निहित मदद पर कुछ देखने के लिए चलाएँ ।
— फ्लिम

8

के लिए संदर्भ से set:

-इ

यदि एक साधारण कमांड (धारा 3.2.1 सरल कमांड देखें) से बाहर निकलें, तब तक एक गैर-शून्य स्थिति के साथ बाहर निकलता है, जब तक कि विफल होने वाली कमांड एक जब तक या लूप का हिस्सा नहीं है, अगर एक स्टेटमेंट का हिस्सा, a && या का हिस्सा है || सूची, या यदि कमांड की वापसी स्थिति का उपयोग करके उलटा किया जा रहा है! " ईआरआर पर एक जाल, यदि सेट किया जाता है, तो शेल बाहर निकलने से पहले निष्पादित किया जाता है।

(जोर मेरा)।


"-ई" का उपयोग करते समय "-ई" जोड़ने के लायक हो सकता है, देखें vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
— Max

3

shdevguydavid के उत्तर का संस्करण ।

#!/bin/sh
set -e
cleanup() {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

ref: shellscript.sh


POSIXमुझे हंसाता है। :) महान शिक्षण साइट आप के रूप में अच्छी तरह से जुड़ा हुआ है।
— कोमेट्सॉन्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.