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


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.