বাশ স্ক্রিপ্ট চালানোর সময় লাইন নম্বরটি কীভাবে প্রদর্শিত হবে


89

আমার একটি পরীক্ষার স্ক্রিপ্ট রয়েছে যার প্রচুর কমান্ড রয়েছে এবং প্রচুর আউটপুট উত্পন্ন করবে, আমি ব্যবহার করি set -xবা set -vএবং set -e, সুতরাং ত্রুটি দেখা দিলে স্ক্রিপ্টটি বন্ধ হয়ে যায়। যাইহোক, সমস্যাটি সনাক্ত করতে কার্যকর হওয়া রেখাটি কোন লাইনে এসেছিল তা সনাক্ত করা এখনও আমার পক্ষে কঠিন। এমন কোনও পদ্ধতি আছে যা প্রতিটি লাইন কার্যকর হওয়ার আগে স্ক্রিপ্টের লাইন নম্বর আউটপুট করতে পারে? বা আউটপুট লাইন নম্বর কমান্ড প্রদর্শনীর দ্বারা উত্পাদিত আগে set -x? বা যে কোনও পদ্ধতি যা আমার স্ক্রিপ্ট লাইন অবস্থানের সমস্যা মোকাবেলা করতে পারে তা একটি দুর্দান্ত সহায়তা। ধন্যবাদ

উত্তর:


161

আপনি উল্লেখ করেছেন যে আপনি ইতিমধ্যে ব্যবহার করছেন -x। পরিবর্তনশীল PS4মানটি নির্দেশ করে যখন -xবিকল্পটি সেট করা হয় এবং :স্থানটি ডিফল্ট হয় তারপরে কমান্ড লাইনটি প্রতিধ্বনিত হওয়ার আগে প্রম্পট প্রিন্ট করা হয়।

আপনি PS4নির্গত করতে পরিবর্তন করতে পারেন LINENO(স্ক্রিপ্টে লাইন নম্বর বা বর্তমানে চালিত শেল ফাংশন)।

উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টটি পড়ে:

$ 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/scriptting/debuggingtips চূড়ান্ত দেয় PS4যা আপনার সম্ভাব্য ট্রেসিংয়ের জন্য প্রয়োজনীয় সমস্ত কিছু আউটপুট দেয় :

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

4
আমি অবাক হয়েছি কেন "শেল স্ক্রিপ্টগুলি কীভাবে ডিবাগ করবেন?" । এটি কেবল তুলনায় অনেক ভালecho
সুভর্ণা পাতায়িল

@ ভাসপ সম্মত, অপ্রয়োজনীয় echoবিবৃতি সেরাভাবে এড়ানো যায়।
ডেভনুল

4
আমি সাহায্য করতে পারি না তবে অনুভব করতে পারি যে লাইন নম্বরগুলি মুদ্রণ করা -x উচিত । অথবা, হতে পারে - লাইন নম্বর অন্তর্ভুক্ত করা nx উচিত । আমার জন্য এটি "ডাব্লুটিএফ" মুহুর্তগুলির মধ্যে একটি ...
jw

4
মানুষ, আমি আশা করি আমি PS4 এর
সমাহার

4
\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'কিছু রঙের জন্য
ইউলিস বিএন

35

বাশে, $LINENO -এ লাইন নম্বর রয়েছে যেখানে স্ক্রিপ্টটি বর্তমানে চালাচ্ছে।

ফাংশনটি কোথায় ডাকা হয়েছিল সেই লাইন নম্বরটি যদি আপনার জানা দরকার তবে চেষ্টা করুন $BASH_LINENO । নোট করুন যে এই ভেরিয়েবলটি একটি অ্যারে।

উদাহরণ স্বরূপ:

#!/bin/bash       

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

function foo() {
    log "$@"
}

foo "$@"

বাশ ভেরিয়েবলের বিশদ জানতে এখানে দেখুন ।


0

সরল (তবে শক্তিশালী) সমাধান: echoআপনার মনে হয় এমন কোডের চারপাশে রাখুন যা সমস্যা বলে মনে করে এবং echoস্ক্রিনে বার্তাগুলি আর উপস্থিত না হওয়া অবধি লাইনটি লাইনটি সরান - কারণ স্ক্রিপ্টটি আগে কোনও ত্রুটির কারণে বন্ধ হয়ে গেছে।

আরও বেশি শক্তিশালী সমাধান: bashdbব্যাশ ডিবাগার ইনস্টল করুন এবং স্ক্রিপ্ট লাইনটি লাইন দিয়ে ডিবাগ করুন


4
echoআশেপাশে স্টাটগুলি আইএনএন অনেক ক্ষেত্রে সহায়তা করতে পারে তবে আপনি যখন অর্থবোধক, পার্সেবল আউটপুট রয়েছে এমন কার্যগুলিতে এটি প্রয়োগ করার চেষ্টা করেন তখন তা হ্রাস পায়।
ইলিরান মালকা

4
@ ইলিরানমালকা ফেয়ার পয়েন্ট সেক্ষেত্রে আপনি echo "foo" >&2
স্টোডার

4
... উদ্দেশ্য হ'ল সমস্ত ক্ষেত্রে স্ট্যাডারকে প্রতিপন্ন করা উচিত যখন উদ্দেশ্যটি এমন বার্তা যা প্রকৃতির ডায়াগোনস্টিক।
চার্লস ডাফি

0

লিনেনো ছাড়াই শেলগুলির জন্য কার্যপ্রণালী

মোটামুটি পরিশীলিত স্ক্রিপ্টে আমি সমস্ত লাইন নম্বর দেখতে চাই না; বরং আমি আউটপুট নিয়ন্ত্রণ করতে চাই।

একটি ফাংশন সংজ্ঞায়িত করুন

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 হয়।

এটি মূলত এই প্রশ্নের উত্তর দেয় যে ছাই বা অন্য শেলের ব্যবহারকারীদের জন্য বাশ স্ক্রিপ্ট চালানোর সময় লাইন নম্বরটি কীভাবে প্রদর্শিত হবেLINENO

আর কিছু যোগ করার আছে?

অবশ্যই আপনার এটার দরকার কেন? আপনি এটি দিয়ে কীভাবে কাজ করবেন? আপনি এই কি করতে পারেন? এই সহজ পদ্ধতির কি সত্যিই যথেষ্ট বা দরকারী? আপনি এটিকে কেন একেবারেই টিঙ্ক করতে চান?

আরও জানতে চাও? ডিবাগিংয়ের প্রতিচ্ছবি পড়ুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.