Bash betiği çalıştırılırken satır numarası nasıl gösterilir


89

Çok sayıda komut içeren ve çok sayıda çıktı üretecek bir test betiğim var, set -xveya set -vve kullanıyorum set -e, böylece hata oluştuğunda betik duracaktı. Ancak, sorunun yerini tespit etmek için uygulamanın hangi satırda durduğunu bulmak benim için hala oldukça zor. Her satır çalıştırılmadan önce betiğin satır numarasını çıkarabilen bir yöntem var mı? Veya komut sergi öncesinde çıkış satır numarası tarafından oluşturulan set -x? Veya senaryo satırı konum sorunumla başa çıkabilecek herhangi bir yöntem çok yardımcı olacaktır. Teşekkürler.

Yanıtlar:


161

Zaten kullandığınızı söylüyorsunuz -x. Değişken PS4, değerin, -xseçenek ayarlandığında komut satırı yankılanmadan önce yazdırılan istem olduğunu ve varsayılan değerin :ardından boşluk olduğunu belirtir .

(Şu anda çalıştırılan koddaki veya kabuk işlevindeki satır numarası) PS4yayınlamak için değiştirebilirsiniz LINENO.

Örneğin, komut dosyanız şunları okursa:

$ cat script
foo=10
echo ${foo}
echo $((2 + 2))

Bu şekilde yürütmek satır numaralarını yazdırır:

$ PS4='Line ${LINENO}: ' bash -x script
Line 1: foo=10
Line 2: echo 10
10
Line 3: echo 4
4

http://wiki.bash-hackers.org/scripting/debuggingtips , PS4izleme için ihtiyaç duyacağınız her şeyi çıkaracak en üst noktayı verir :

export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

4
Merak ediyorum neden kimse bundan "Kabuk betiklerinde hata ayıklama nasıl yapılır?" . Bu sadece daha iyidirecho
Suvarna Pattayil

@VusP Kabul edildi, gereksiz echoifadelerden en iyi şekilde kaçınılmalıdır.
devnull

2
Yardım edemem ama bunun satır numaralarını basması -x gerektiğini hissediyorum . Veya belki - satır numaralarını nx içermelidir . Benim için bu "WTF" anlarından biri ...
jww

1
Dostum, keşke o PS4 karışımını daha önce bilseydim ... Beni çok fazla baş ağrısından
kurtarırdı

2
\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'bazı renkler için
Ulysse BN

35

Bash'de, $LINENObetiğin o anda çalışmakta olduğu satır numarasını içerir.

Fonksiyonun çağrıldığı satır numarasını bilmeniz gerekiyorsa deneyin $BASH_LINENO. Bu değişkenin bir dizi olduğuna dikkat edin.

Örneğin:

#!/bin/bash       

function log() {
    echo "LINENO: ${LINENO}"
    echo "BASH_LINENO: ${BASH_LINENO[*]}"
}

function foo() {
    log "$@"
}

foo "$@"

Bash değişkenlerinin ayrıntıları için buraya bakın .


0

Basit (ama güçlü) çözüm: echoSoruna neden olduğunu düşündüğünüz kodun etrafına yerleştirin echove mesajlar artık ekranda görünmeyene kadar satır satır hareket ettirin - çünkü komut dosyası daha önce bir hata nedeniyle durmuştur.

Daha da güçlü çözüm: bashdbbash hata ayıklayıcısını yükleyin ve komut dosyasında satır satır hata ayıklayın


2
echoEtrafta bir şeyler bulmak çoğu durumda yardımcı olabilir, ancak bunları anlamlı, ayrıştırılabilir çıktıya sahip işlevlere uygulamaya çalıştığınızda yetersiz kalır.
Eliran Malka

1
@EliranMalka Fuar noktası. Bu durumda echo "foo" >&2
stderr'e yankılanabilirsiniz

1
... amaç doğası gereği tanısal mesajlar olduğunda, kişi her durumda stderr'e yankılanmalıdır .
Charles Duffy

0

LINENO'suz kabuklar için geçici çözüm

Oldukça karmaşık bir senaryoda tüm satır numaralarını görmek istemezdim; bunun yerine çıktının kontrolünün ben olmasını isterim.

Bir işlev tanımlayın

echo_line_no () {
    grep -n "$1" $0 |  sed "s/echo_line_no//" 
    # grep the line(s) containing input $1 with line numbers
    # replace the function name with nothing 
} # echo_line_no

Şunun gibi alıntılarla kullanın

echo_line_no "this is a simple comment with a line number"

Çıktı

16   "this is a simple comment with a line number"

kaynak dosyadaki bu satırın numarası 16 ise.

Bu temelde , kül veya diğer kabukların kullanıcıları için bash betiği çalıştırılırken satır numarası nasıl gösterilir sorusuna cevap verir LINENO.

Eklenecek başka bir şey var mı?

Elbette. Niçin buna ihtiyacın var? Bununla nasıl çalışıyorsun? Bununla ne yapabilirsin? Bu basit yaklaşım gerçekten yeterli mi yoksa yararlı mı? Neden bununla uğraşmak istiyorsun?

Daha fazlasını öğrenmek ister misin? Hata ayıklamaya ilişkin düşünceleri okuyun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.