কোনও ত্রুটি ঘটলে আমি বাশে লাইন নম্বরটি কীভাবে সন্ধান করব?


21

বাশে লাইন নম্বরটি কীভাবে খুঁজে পাবেন যেখানে একটি ত্রুটি ঘটেছে?

উদাহরণ

আমাদের কী প্রয়োজন তা বোঝাতে আমি লাইন নম্বরগুলি সহ নিম্নলিখিত সাধারণ স্ক্রিপ্টটি তৈরি করি। স্ক্রিপ্ট থেকে ফাইলগুলি অনুলিপি করবে

cp $file1 $file2
cp $file3 $file4

যখন এক cpকমান্ড তারপর ব্যর্থ ফাংশন বন্ধ হয়ে যাবে প্রস্থান 1 । লাইন নম্বর (উদাহরণস্বরূপ, 8 বা 12) দিয়ে ত্রুটিটি মুদ্রণের জন্য আমরা ফাংশনে দক্ষতা যুক্ত করতে চাই।

এটা কি সম্ভব?

নমুনা লিপি

1 #!/bin/bash
2
3
4 function in_case_fail {
5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1
6 }
7
8 cp $file1 $file2
9 in_case_fail $? "cp $file1 $file2"
10
11
12 cp $file3 $file4
13 in_case_fail $? "cp $file3 $file4"
14


আপনি ব্যবহার করতে পারেন set -xএবং / অথবা set -vকার্যকর করা হয়েছে তা ট্রেস করতে। আপনি যা চেয়েছিলেন ঠিক তা নয় তবে এটি সম্ভবত সহায়কও হবে।
রল্ফ

উত্তর:


29

আপনার ফাংশনটি ব্যবহার না করে পরিবর্তে আমি এই পদ্ধতিটি ব্যবহার করব:

$ cat yael.bash
#!/bin/bash

set -eE -o functrace

file1=f1
file2=f2
file3=f3
file4=f4

failure() {
  local lineno=$1
  local msg=$2
  echo "Failed at $lineno: $msg"
}
trap 'failure ${LINENO} "$BASH_COMMAND"' ERR

cp -- "$file1" "$file2"
cp -- "$file3" "$file4"

এটি ERR এ আটকে এবং তারপরে failure()কার্যকর করা লাইন নম্বর + বাশ কমান্ডের সাথে ফাংশনটিতে কল করে কাজ করে।

উদাহরণ

এখানে আমি কোন যত্ন ফাইল তৈরি করতে গ্রহণ করেছি, f1, f2, f3, অথবা f4। আমি যখন উপরের স্ক্রিপ্টটি চালাব:

$ ./yael.bash
cp: cannot stat f1’: No such file or directory
Failed at 17: cp -- "$file1" "$file2"

এটি ব্যর্থ হয়, কার্যকর করা হয়েছে এমন লাইন নম্বর প্লাস কমান্ডের প্রতিবেদন করে।


14

LINENOবর্তমান লাইন নম্বরটি ধারণ করার পাশাপাশি , সেখানে BASH_LINENOএবং FUNCNAME(এবং BASH_SOURCE) অ্যারে রয়েছে যাতে তারা ফাংশনের নাম এবং লাইন নম্বরগুলি ডেকে থাকে।

সুতরাং আপনি এই মত কিছু করতে পারে:

#!/bin/bash

error() {
        printf "'%s' failed with exit code %d in function '%s' at line %d.\n" "${1-something}" "$?" "${FUNCNAME[1]}" "${BASH_LINENO[0]}"
}

foo() {
        ( exit   0 ) || error "this thing"
        ( exit 123 ) || error "that thing"
}

foo

প্রিন্ট হবে যে চলমান

'that thing' failed with exit code 123 in function 'foo' at line 9.

আপনি যদি ব্যবহার করেন set -eবা trap ... ERRস্বয়ংক্রিয়ভাবে ত্রুটিগুলি সনাক্ত করতে পারেন তবে তাদের কিছু সতর্কতা রয়েছে তা নোট করুন। সেই সময়ে স্ক্রিপ্টটি কী করছিল তার একটি বিবরণ অন্তর্ভুক্ত করাও শক্ত (যদিও আপনি নিজের উদাহরণে করেছিলেন) যদিও এটি কেবল রেখা সংখ্যার চেয়ে নিয়মিত ব্যবহারকারীর পক্ষে আরও কার্যকর হতে পারে।

set -eএবং অন্যান্যদের সাথে ইস্যুগুলির জন্য যেমন দেখুন :


13

বাশের একটি বিল্ট-ইন ভেরিয়েবল রয়েছে $LINENOযা কোনও বিবৃতি দেওয়ার সময় বর্তমান লাইন নম্বর দ্বারা প্রতিস্থাপন করা হয়, সুতরাং আপনি এটি করতে পারেন

in_case_fail $? "at $LINENO: cp $file1 $file2"

trap ... ERRকমান্ড ব্যর্থ হলে কোনটি রান হয় তা ব্যবহার করার চেষ্টা করতে পারেন (যদি ফলাফলটি পরীক্ষা না করা হয়)। উদাহরণ:

trap 'rc=$?; echo "error code $rc at $LINENO"; exit $rc' ERR

তারপরে যদি কোনও কমান্ড cp $file1 $file2ব্যর্থ হয় তবে আপনি লাইন নম্বর এবং একটি প্রস্থান সহ ত্রুটি বার্তা পাবেন। আপনি ভেরিয়েবলের ত্রুটিতে কমান্ডটিও পাবেন $BASH_COMMAND(যদিও কোনও পুনর্নির্দেশ নয়)।

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