मेरे पास एक स्क्रिप्ट है जो मापती है कि कब तक कुछ कमांड निष्पादित होती है।
इसे "वास्तविक" 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
आउटपुट दे रहा है ।