আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা কিছু কমান্ড কতক্ষণ চালায় তা পরিমাপ করে।
এটির জন্য "রিয়েল" 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।