it-swarm.asia

كيفية إظهار رقم السطر عند تنفيذ البرنامج النصي bash

لديّ برنامج نصي للاختبار يحتوي على الكثير من الأوامر وسيولد الكثير من المخرجات ، وأنا أستخدم set -x أو set -v و set -e ، لذلك سيتوقف البرنامج النصي عند حدوث خطأ. ومع ذلك ، لا يزال من الصعب جدًا تحديد الخط الذي توقف فيه التنفيذ من أجل تحديد المشكلة. هل هناك طريقة يمكنها إخراج رقم سطر البرنامج النصي قبل تنفيذ كل سطر؟ أو قم بإخراج رقم السطر قبل معرض الأوامر الذي تم إنشاؤه بواسطة set -x؟ أو أي طريقة يمكن أن تتعامل مع مشكلة موقع سطر النص الخاص بي ستكون مساعدة كبيرة. شكر.

64
dspjm

لقد ذكرت أنك تستخدم بالفعل -x. يشير المتغير PS4 إلى أن القيمة هي مطالبة مطبوعة قبل أن يتم تكرار سطر الأوامر عند تعيين الخيار -x والافتراضات إلى : متبوعة بمسافة.

يمكنك تغيير PS4 لإصدار LINENO (رقم السطر في البرنامج النصي أو وظيفة Shell التي يتم تنفيذها حاليًا).

على سبيل المثال ، إذا قرأ النص البرمجي الخاص بك:

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

سيؤدي تنفيذ ذلك إلى طباعة أرقام الأسطر:

$ 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 يمنح PS4 النهائي الذي سينتج كل شيء ربما تحتاجه لتتبع:

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

في Bash ، يحتوي $LINENO على رقم السطر حيث يتم تنفيذ البرنامج النصي حاليًا.

إذا كنت بحاجة إلى معرفة رقم السطر الذي تم استدعاء الوظيفة فيه ، فحاول $BASH_LINENO. لاحظ أن هذا المتغير عبارة عن صفيف.

فمثلا:

#!/bin/bash       

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

function foo() {
    log "[email protected]"
}

foo "[email protected]"

انظر هنا للحصول على تفاصيل متغيرات Bash.

25
Deqing

الحل البديل للقذائف دون LINENO

في نص متطور إلى حد ما لا أرغب في رؤية جميع أرقام الأسطر ؛ بدلا أود أن أكون في السيطرة على الإخراج.

تحديد وظيفة

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

استخدامه مع اقتباسات مثل

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

الإخراج هو

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

إذا كان رقم هذا الخط في الملف المصدر هو 16.

هذا يجيب بشكل أساسي على السؤال كيفية إظهار رقم السطر عند تنفيذ البرنامج النصي bash لمستخدمي الرماد أو الأصداف الأخرى دون LINENO.

أي شيء أكثر لإضافة؟

بالتأكيد. لماذا تحتاج هذه؟ كيف تعمل مع هذا؟ ماذا يمكنك أن تفعل هذا؟ هل هذا النهج البسيط حقًا كافي أم مفيد؟ لماذا تريد العبث بهذا على الإطلاق؟

اريد معرفة المزيد؟ قراءة الانعكاسات على تصحيح الأخطاء

0
kklepper

حل بسيط (لكن قوي): ضع echo حول الكود الذي تعتقد أنه يسبب المشكلة وانقل السطر echo إلى أن تظهر الرسائل بعد الآن على الشاشة - لأن البرنامج النصي توقف بسبب خطأ من قبل.

حل أكثر قوة: تثبيت bashdb مصحح أخطاء bash وتصحيح خط البرنامج النصي سطراً

0
hek2mgl