2016-03-04 23 views
7

yılında '-e set' kullanarak tuzak ERR için:nasıl basit bir senaryomuz var Bash

#!/bin/bash 
set -e 
trap "echo BOO!" ERR 

function func(){ 
    ls /root/ 
} 

func 

isterim benim komut dosyası (başarısız olursa tuzak ERR için burada olacak b/I do not c/root içine bakmak için izinlere sahip olmak. Ancak, set -e kullanırken, sıkışmış değil. set -e olmadan ERR sıkıştı. set -e için bash adam sayfasına göre

: ayarlarsanız

... ERR Üzerine Bir tuzak, kabuk çıkmadan önce çalıştırılır. ...

Neden tuzağım yürütülür? Man sayfasından olması gerektiği gibi görünüyor.

+0

Bir kenara göre: _uple-quote_ öğesinde, _up front_. – mklement0

cevap

11

chepner's answer iyi çözüm olduğunu okuyun: Eğer set -e birleştirmek isterseniz (Aynı durum: set -o errexit) ile Bir ERR tuzak, ayrıca set -o errtrace (set -E ile aynı) kullanın.

Kısacası

: sadece set -e yerine set -eE kullanın: seti, ERR üzerindeki herhangi tuzak tarafından

miras ise:

#!/bin/bash 

set -eE # same as: `set -o errexit -o errtrace` 
trap "echo BOO!" ERR 

function func(){ 
    ls /root/ 
} 

func 

man bash yaklaşık set -o errtrace/set -E diyor kabuk işlevleri, komut ikameleri ve alt kabuk ortamında yürütülen komutlar. ERR kapanı normalde bu gibi durumlarda miras alınmaz.

Ne oluyor inanıyoruz Ne:

  • -e olmadan: ls komut nedeniyle fonksiyonunda son komut olmanın, senin işlevin içinde başarısız ve fonksiyon ls 's raporları Arayanıza sıfır olmayan çıkış kodu, en üst düzey komut dosyası kapsamınız. kapsamındaki kapsamı, ERR kapanı etkindir ve çağrılır (ancak, tuzaktan exit'u açıkça aramadıkça yürütmenin devam edeceğini unutmayın).-e (ancak -E olmadan) ile

  • : ls komutu fonksiyonu içine başarısız olur ve set -e yürürlükte olduğu için, Bash anında çıkışlar, fonksiyon kapsamı doğrudan - ve beri var hiçbir ERR no'lu etki alanı (üst kapsamdan miras alınmadığından), tuzak aranmaz. man sayfa yanlış olmasa da

, bu davranış tam olarak açık değildir konusunda hemfikir - Bunu anlaması gerekir.

3

EXIT ile ERR'u değiştirin ve işe yarayacaktır.

trap komutunun sözdizimi: trap [COMMANDS] [SIGNALS]

fazla bilgi için, http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html

+0

Bu yüzden man sayfa yanlış mı? –

+3

Bu geçerli bir geçici çözüm olsa da (eğer gerekli değilse, '-o errtrace' kullanılıyorsa), _successful_ termination durumunda da 'EXIT' çağrıldığından bahsetmelisiniz, bu yüzden böyle bir koşul eklemeniz gerekir. eğer [[$? -ne 0]]… 'işleyiciye. – mklement0

3

Kapatma işleminin devralması için set -o errtrace kullanmanız gerekir.