2010-12-12 14 views
34

Bu Bash işleri pasajı:Neden "yerel" bir komutun dönüş kodunu süpürüyor? Beklediğim etmezdi

$ fun1() { x=$(false); echo "exit code: $?"; } 
$ fun1 
exit code: 1 

Ama bu, local kullanarak değil: local komutunun dönüş kodu süpürmek yok neden

$ fun2() { local x=$(false); echo "exit code: $?"; } 
$ fun2 
exit code: 0 

kimse açıklayabilir ?

+1

genellikle tanımlamak ve tek bir satırda bir değişken kullanmayı tercih https://lists.gnu.org/archive/html/bug-bash/2010-03/msg00007.html – tokland

cevap

41

local kodunun 0 değerini döndürmesi, $? "En son yürütülen ön plandaki boru hattının çıkış durumuna genişler." Böylece $? Sen şöyle x başlatılması gelen x ilanını ayırarak bu davranışı düzeltebilir local

başarısını dönüyor:

$ fun() { local x; x=$(false); echo "exit code: $?"; }; fun 
exit code: 1 
+0

bak, ama evet bu bir olduğunu kabul edilebilir bir çözüm. – tokland

+4

Kayıt için sorun BashPitfalls wiki'de tartışılmaktadır: http://mywiki.wooledge.org/BashPitfalls#local_varname.3D.24.28command.29 – tokland

+0

Delirdiğimi düşündüm ... teşekkürler! – peteroak

2

local komutunun dönüş kodu dönüş kodu gizler false

+1

Evet, anlıyorum, ama yerel bir anahtar kelime olarak, onu gizlememeyi umuyorum. Sanırım yanlış bir varsayımdı. – tokland

+3

Bu "özel anahtar kelime" değil, bir kabuk yerleşik. Hatta yerleşiklerin dönüş değerleri vardır. –

+0

teşekkürler @Ignacio, haklısınız, "yerel VAR = $ (command) || 1" – tokland

İlgili konular