ইআরআর সিগন্যালটি কোন রেখা থেকে পাঠানো হয়েছিল তা পাওয়া সম্ভব?
হ্যাঁ, LINENO
এবং BASH_LINENO
ভেরিয়েবলগুলি ব্যর্থতার লাইন এবং এটির দিকে নিয়ে যাওয়া লাইনগুলি পাওয়ার জন্য উপকারী er
বা সম্ভবত আমি এই সব ভুল করছি?
নাহ, গ্রেপ -q
সহ সবেমাত্র বিকল্প অনুপস্থিত ...
echo hello | grep -q "asdf"
... -q
বিকল্পের জন্য এবং জন্য grep
ফিরে আসবে । এবং বাশে এটা না ...0
true
1
false
trap
Trap
trap "_func" ERR
... আমার একটি দেশীয় সমাধান দরকার ...
এখানে এমন একটি ট্র্যাপার রয়েছে যা আপনি কিছুটা সাইক্লোমেটিক জটিলতায় ডিবাগ করার জন্য দরকারী খুঁজে পেতে পারেন ...
failure.sh
## Outputs Front-Mater formatted failures for functions not returning 0
## Use the following line after sourcing this file to set failure trap
## trap 'failure "LINENO" "BASH_LINENO" "${BASH_COMMAND}" "${?}"' ERR
failure(){
local -n _lineno="${1:-LINENO}"
local -n _bash_lineno="${2:-BASH_LINENO}"
local _last_command="${3:-${BASH_COMMAND}}"
local _code="${4:-0}"
## Workaround for read EOF combo tripping traps
if ! ((_code)); then
return "${_code}"
fi
local _last_command_height="$(wc -l <<<"${_last_command}")"
local -a _output_array=()
_output_array+=(
'---'
"lines_history: [${_lineno} ${_bash_lineno[*]}]"
"function_trace: [${FUNCNAME[*]}]"
"exit_code: ${_code}"
)
if [[ "${#BASH_SOURCE[@]}" -gt '1' ]]; then
_output_array+=('source_trace:')
for _item in "${BASH_SOURCE[@]}"; do
_output_array+=(" - ${_item}")
done
else
_output_array+=("source_trace: [${BASH_SOURCE[*]}]")
fi
if [[ "${_last_command_height}" -gt '1' ]]; then
_output_array+=(
'last_command: ->'
"${_last_command}"
)
else
_output_array+=("last_command: ${_last_command}")
fi
_output_array+=('---')
printf '%s\n' "${_output_array[@]}" >&2
exit ${_code}
}
... এবং কার্যকারিতা ট্রেসিংয়ের জন্য উপরের ফাঁদটি কীভাবে সেট করবেন সে ক্ষেত্রে সূক্ষ্ম পার্থক্য প্রকাশ করার জন্য উদাহরণ ব্যবহারের স্ক্রিপ্ট ...
example_usage.sh
#!/usr/bin/env bash
set -E -o functrace
## Optional, but recommended to find true directory this script resides in
__SOURCE__="${BASH_SOURCE[0]}"
while [[ -h "${__SOURCE__}" ]]; do
__SOURCE__="$(find "${__SOURCE__}" -type l -ls | sed -n 's@^.* -> \(.*\)@\1@p')"
done
__DIR__="$(cd -P "$(dirname "${__SOURCE__}")" && pwd)"
## Source module code within this script
source "${__DIR__}/modules/trap-failure/failure.sh"
trap 'failure "LINENO" "BASH_LINENO" "${BASH_COMMAND}" "${?}"' ERR
something_functional() {
_req_arg_one="${1:?something_functional needs two arguments, missing the first already}"
_opt_arg_one="${2:-SPAM}"
_opt_arg_two="${3:0}"
printf 'something_functional: %s %s %s' "${_req_arg_one}" "${_opt_arg_one}" "${_opt_arg_two}"
## Generate an error by calling nothing
"${__DIR__}/nothing.sh"
}
## Ignoring errors prevents trap from being triggered
something_functional || echo "Ignored something_functional returning $?"
if [[ "$(something_functional 'Spam!?')" == '0' ]]; then
printf 'Nothing somehow was something?!\n' >&2 && exit 1
fi
## And generating an error state will cause the trap to _trace_ it
something_functional '' 'spam' 'Jam'
উপরের যেখানে বাশ সংস্করণ 4+ তে পরীক্ষা করা হয়েছে, সুতরাং চারটি পূর্বের সংস্করণগুলির জন্য কিছু প্রয়োজন হলে একটি মন্তব্য দিন বা যদি নূন্যতম সংস্করণের চারটি সিস্টেমে ব্যর্থতা আটকাতে ব্যর্থ হয় তবে একটি সমস্যা খুলুন ।
প্রধান অবলম্বন হ'ল ...
set -E -o functrace
trap 'failure "LINENO" "BASH_LINENO" "${BASH_COMMAND}" "${?}"' ERR
একক উদ্ধৃতি ফাংশন কল এবং চারপাশে ডাবল উদ্ধৃতি পৃথক যুক্তি প্রায় ব্যবহৃত হয়
বর্তমান মানগুলির পরিবর্তে রেফারেন্সগুলি LINENO
এবং BASH_LINENO
পাস করা হয়, যদিও এটি ফাঁদে যুক্ত লিঙ্কের পরবর্তী সংস্করণগুলিতে ছোট করা যেতে পারে, যেমন চূড়ান্ত ব্যর্থতার রেখা এটিকে আউটপুটে পরিণত করে
প্রথমে কোনও ত্রুটি ফিরে পেয়েছিল এমন কমান্ড পাওয়ার জন্য প্রথমে BASH_COMMAND
এবং প্রস্থান স্থিতির মানগুলি ( $?
) পাস হয়ে যায় এবং দ্বিতীয়টি নিশ্চিত করা যায় যে ত্রুটিটি অ-ত্রুটিযুক্ত স্থিতিতে ট্র্যাপটি ট্রিগার করে না does
এবং অন্যরা মতানৈক্য করতে পারলে আমি আউটপুট অ্যারে তৈরি করা এবং নিজের লাইনে প্রতিটি অ্যারে উপাদান মুদ্রণের জন্য প্রিন্টফ ব্যবহার করা আরও সহজ ...
printf '%s\n' "${_output_array[@]}" >&2
... >&2
শেষে কিছুটা হলেও ত্রুটিগুলি যেখানে তাদের উচিত (স্ট্যান্ডার্ড ত্রুটি) হওয়া উচিত, এবং কেবল ত্রুটিগুলি ক্যাপচার করার অনুমতি দেয় ...
## ... to a file...
some_trapped_script.sh 2>some_trapped_errros.log
## ... or by ignoring standard out...
some_trapped_script.sh 1>/dev/null
স্ট্যাক ওভারফ্লোতে এগুলি এবং অন্যান্য উদাহরণ দ্বারা প্রদর্শিত হিসাবে , ইউটিলিটিগুলিতে বিল্ট ব্যবহার করে একটি ডিবাগিং সহায়তা তৈরির প্রচুর উপায় রয়েছে।
bashdb
। দেখে মনে হচ্ছে যে প্রথম যুক্তিতেtrap
ভেরিয়েবল থাকতে পারে যা পছন্দসই প্রসঙ্গে মূল্যায়ন করা হয়। তাইtrap 'echo $LINENO' ERR'
কাজ করা উচিত।