আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা কিছু কমান্ড কতক্ষণ চালায় তা পরিমাপ করে।
এটির জন্য "রিয়েল" time
কমান্ড দরকার, অর্থাত্ বাইনারি উদাহরণস্বরূপ /usr/bin/time
(যেমন ব্যাশ-অন্তর্নির্মিত -f
পতাকা থাকে না )।
নীচে, একটি সরলীকৃত স্ক্রিপ্ট যা ডিবাগ করা যেতে পারে:
#!/bin/bash
TIMESEC=$(echo blah | ( /usr/bin/time -f %e grep blah >/dev/null ) 2>&1 | awk -F. '{print $1}')
echo ABC--$TIMESEC--DEF
if [ "$TIMESEC" -eq 0 ] ; then
echo "we are here!"
fi
"Test.sh" হিসাবে সংরক্ষণ করুন এবং সম্পাদন করুন:
$ bash test.sh
ABC--0--DEF
we are here!
সুতরাং এটি কাজ করে।
এখন, বাশ কমান্ড লাইনে "-x" যুক্ত করে এটি ডিবাগ করার চেষ্টা করা যাক:
$ bash -x test.sh
++ echo blah
++ awk -F. '{print $1}'
+ TIMESEC='++ /usr/bin/time -f %e grep blah
0'
+ echo ABC--++ /usr/bin/time -f %e grep blah 0--DEF
ABC--++ /usr/bin/time -f %e grep blah 0--DEF
+ '[' '++ /usr/bin/time -f %e grep blah
0' -eq 0 ']'
test.sh: line 10: [: ++ /usr/bin/time -f %e grep blah
0: integer expression expected
যখন আমরা "-x" ব্যবহার করি এবং এটি ব্যতীত সূক্ষ্মভাবে কাজ করি তখন কেন এই স্ক্রিপ্টটি ভেঙে যায়?
BASH_XTRACEFD
আপনাকে set -x
আউটপুটটিকে অন্য কোথাও পুনর্নির্দেশ করতে দেয় এটির সমস্যা কম।
-x
,$()
কনস্ট্রাক্ট-x
তার ফলাফলের মান হিসাবে আউটপুট অন্তর্ভুক্ত করছে। এটি "প্রত্যাশিত" আচরণ বা ত্রুটিযুক্ত কিনা তা জানেন না ... বা সম্ভবত এটি আউটপুট()
দিচ্ছে এটি ভিতরে থাকা সাবশেল-x
।