2014-12-09 14 views
7

numaralı telefon hattında yanlış satır numarası veriyor Bash kapanı işlevinde caller yerleşimini kullanırken, caller 0 sonucu yanlış satır numarası veriyor ve her zaman 1 veriyor. her zaman hat numarası olarak 1 vermek gibi görünen bir tuzak işleyicisindeki caller 0 kullanırken i > 0 için çıkış, doğru olsaarayan 0, trap işleyicisinde

1 foo ./test.sh 
6 bar ./test.sh 
15 main ./test.sh 

: Örneğin:

#!/bin/bash 
function foo { 
    exit 1 
} 
function bar { 
    foo 
} 
function err { 
    ((i = 0)) 
    while caller $i; do 
     ((++i)) 
    done 
} 
trap err EXIT 
bar 

şu çıktıyı verir. Başarısız fonksiyonun gerçek satır numarasını bir tuzak işleyicisinden almanın bir yolu var mı?

+0

'BASH_LINENO' dizisi arkadaşınız. (Yani "FUNCNAME" ve "BASH_SOURCE"). –

+0

@CharlesDuffy Ne yazık ki 'BASH_LINENO' sadece '0' – Xenopathic

+0

... '1' ile aynı şeyi veriyor ve bu yüzden "trap 'err" $ LINENO "''. Açıkçası, hiç bir zaman EXIT tuzaklarını bu şekilde kullandığını görmedim. Muhtemelen hiç kimse test etmekten rahatsız olmadı. Bir ERR tuzağı kullanmak çok daha az olağandışı olurdu. –

cevap

3

Bu 3.2.57 (1) -Yayın sonra bir hata bazen ortaya çıktığı görülüyor: zaten bash projesi ile bir bug report var gibi gözüküyor

$ bash -version 
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14) 
Copyright (C) 2007 Free Software Foundation, Inc. 

$ bash ./test.sh 
3 foo ./test.sh 
6 bar ./test.sh 
15 main ./test.sh 

$ /usr/local/bin/bash --version 
GNU bash, version 4.3.30(1)-release (x86_64-apple-darwin14.1.0) 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

$ /usr/local/bin/bash ./test.sh 
1 foo ./test.sh 
6 bar ./test.sh 
15 main ./test.sh 

.

+0

Geçtiğimiz günlerde. Nedenini bildiğinize sevindim ... –

+0

[ERR ve RETURN tuzaklarındaki hatalar şimdi giderilmiştir] (http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00132.html) – Manubhargav

+0

Bu görünüyor En azından benim testlerimde düzeltildi. –

İlgili konular