2013-09-30 17 views
5

böyle, benim Bash komut bir temizlik eylemi istiyorum içinde kabuk script exitCode alın:bir "tuzak EXIT"

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

true 
false 

$? Kullanılması doğal seçim olarak akla geldiği, ancak bu durum böyle değil. Her zaman 0 içerir. Ben ERR tuzak exitcode üzerinde "casus" herhangi bir yolu var mı?

[Güncelleme:] Ben önce test ne olduğunu hiçbir fikrim yok. Bu kod bir çekicilik gibi çalışır, ben de burada küçük ve güzel bir örnek olarak bırakıyorum.

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ true 
+ false 
++ echo 'E: failed with exitcode 1' 
E: failed with exitcode 1 

Şansı ERR dönen komutu bir && veya || veya diğer koşullara tabi bir şekilde gerçekleştirilmesini şunlardır:

+0

ben '$ düşünüyorum' doğru. Senaryon benim için '1' yazdırıyor. – dogbane

+0

Hah, neyin yanlış gittiğini biliyorum. Bu özelliği test ettiğimizde, bir tek astar yazıp alıntı yanlış anlamış. "Tuzak" eko $ ile çıkıyor? " ERR' açıkça çalışmıyor, çünkü $ $ '' trap' eyleminin _definition_ evaluatedında değerlendiriliyor. –

+0

Arayan herkes için, [benzer bir soru burada] (http://stackoverflow.com/q/32086595/471376). – JamesThomasMoon1979

cevap

3

Kişisel (muhtemelen basitleştirilmiş) örnek söz ettik sorunu gösteren Aşağıdaki snippet'te belirtilmiştir. manual alıntı: Bir sigspecERR olduğunu

Bir basit komut aşağıdaki koşullara tabi sıfırdan farklı çıkış durumu vardır her komut arg yürütülür. Başarısız komut hemen until veya while anahtar kelime aşağıdaki komutu listenin bir parçası ise ERR tuzak yürütülmez, if veya elif saklıdır kelimelerin aşağıdaki testin kısmı bir && veya || listede çalıştırılan bir komutun parçası veya komutun dönüş durumu ! kullanılarak ters olup olmadığını. Bunlar errexit seçeneği uyduğu aynı durumlardır. Eğer varsa

Yani, örneğin, aşağıdaki:

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

false && true 

Gerçekleştirilen bu başarısızlık tuzağa neden olmaz:?

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ false 
İlgili konular