बैश स्क्रिप्ट निष्पादित करते समय लाइन नंबर कैसे दिखाएं


89

मैं एक परीक्षण स्क्रिप्ट जो आदेशों का एक बहुत है है और उत्पादन के बहुत सारे उत्पन्न होगा, मैं का उपयोग करें set -xया set -vऔर set -eइसलिए स्क्रिप्ट जब त्रुटि होती है बंद कर देंगे,। हालाँकि, यह अभी भी मेरे लिए मुश्किल है कि समस्या का पता लगाने के लिए किस लाइन ने निष्पादन रोक दिया। क्या कोई विधि है जो प्रत्येक पंक्ति को निष्पादित करने से पहले स्क्रिप्ट की पंक्ति संख्या को आउटपुट कर सकती है? या आदेश प्रदर्शनी से पहले लाइन नंबर का उत्पादन set -x? या कोई भी तरीका जो मेरी स्क्रिप्ट लाइन लोकेशन की समस्या से निपट सकता है, एक बड़ी मदद होगी। धन्यवाद।

जवाबों:


161

आप उल्लेख करते हैं कि आप पहले से ही उपयोग कर रहे हैं -x। वैरिएबल PS4मान को दर्शाता है कि कमांड लाइन शुरू होने से पहले प्रिंट किया गया प्रॉम्प्ट है, जब -xविकल्प सेट होता है और :स्पेस के बाद डिफॉल्ट होता है।

आप उन्हें बदलने के PS4लिए बदल सकते हैं LINENO(वर्तमान में निष्पादित स्क्रिप्ट या शेल फ़ंक्शन में लाइन नंबर)।

उदाहरण के लिए, यदि आपकी स्क्रिप्ट पढ़ी जाती है:

$ cat script
foo=10
echo ${foo}
echo $((2 + 2))

इसे निष्पादित करने से इस प्रकार लाइन नंबर प्रिंट होंगे:

$ PS4='Line ${LINENO}: ' bash -x script
Line 1: foo=10
Line 2: echo 10
10
Line 3: echo 4
4

http://wiki.bash-hackers.org/scripting/debuggingtips परम को PS4वह सब कुछ प्रदान करता है जो संभवतः आपको ट्रेसिंग के लिए आवश्यक होगा:

export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

4
मुझे आश्चर्य है कि किसी ने "शेल स्क्रिप्ट्स को डीबग करने के लिए" का उल्लेख क्यों नहीं किया? । यह अभी तक सिर्फ तुलना में बेहतर हैecho
सुवर्णा Pattayil

@VusP सहमत, अनावश्यक echoबयानों से बचा जाता है।
देवनुल १५'१४ को

2
मैं मदद नहीं कर सकता लेकिन महसूस करता हूं कि लाइन नंबर प्रिंट -x करना चाहिए । या, हो सकता है - लाइन नंबर शामिल nx करना चाहिए । मेरे लिए, उन "डब्ल्यूटीएफ" क्षणों में से एक ...
1:24 बजे jww

1
यार, काश मैं उस पीएस 4 कॉन्कोलेशन के बारे में जल्द ही जानता ... यह मुझे इतने सिरदर्द से बचा
लेता

2
\033[0;33m+(${BASH_SOURCE}:${LINENO}):\033[0m ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'कुछ रंगों के लिए
उल्यानसे बीएन

35

बैश में, $LINENOवह पंक्ति संख्या होती है जहाँ स्क्रिप्ट वर्तमान में निष्पादित हो रही है।

यदि आपको उस पंक्ति संख्या को जानने की आवश्यकता है जहां फ़ंक्शन को बुलाया गया था, तो प्रयास करें $BASH_LINENO। ध्यान दें कि यह चर एक सरणी है।

उदाहरण के लिए:

#!/bin/bash       

function log() {
    echo "LINENO: ${LINENO}"
    echo "BASH_LINENO: ${BASH_LINENO[*]}"
}

function foo() {
    log "$@"
}

foo "$@"

बैश चर के विवरण के लिए यहां देखें ।


0

सरल (लेकिन शक्तिशाली) समाधान: echoकोड के चारों ओर रखें जो आपको लगता है कि समस्या का कारण बनता है और echoलाइन को लाइन से स्थानांतरित करें जब तक कि संदेश अब स्क्रीन पर दिखाई न दें - क्योंकि स्क्रिप्ट पहले एक त्रुटि के कारण बंद हो गई है।

और भी अधिक शक्तिशाली समाधान: bashdbबैश डीबगर को स्थापित करें और स्क्रिप्ट लाइन को लाइन से डीबग करें


2
echoचारों ओर सामान रखना कई मामलों में मदद कर सकता है, लेकिन जब आप इसे उन कार्यों में लागू करने की कोशिश करते हैं, जो अर्थपूर्ण, पार्स करने योग्य आउटपुट होते हैं, तो कम हो जाते हैं।
एलिरन मलका

1
@ एलिरनमालका मेला स्थल। आप उस स्थिति में प्रतिध्वनित हो सकते हैं:echo "foo" >&2
hek2mgl

1
... किसी को सभी मामलों में stderr को प्रतिध्वनित करना चाहिए जब उद्देश्य संदेश है जो प्रकृति में नैदानिक ​​हैं।
चार्ल्स डफी

0

LINENO के बिना गोले के लिए समाधान

एक काफी परिष्कृत स्क्रिप्ट में मैं सभी पंक्ति संख्याओं को नहीं देखना चाहूंगा; बल्कि मैं आउटपुट के नियंत्रण में रहना चाहूंगा।

एक फ़ंक्शन को परिभाषित करें

echo_line_no () {
    grep -n "$1" $0 |  sed "s/echo_line_no//" 
    # grep the line(s) containing input $1 with line numbers
    # replace the function name with nothing 
} # echo_line_no

जैसे कोट्स के साथ प्रयोग करें

echo_line_no "this is a simple comment with a line number"

आउटपुट है

16   "this is a simple comment with a line number"

यदि स्रोत फ़ाइल में इस पंक्ति की संख्या 16 है।

यह मूल रूप से इस सवाल का जवाब देता है कि बिना राख या अन्य गोले के उपयोगकर्ताओं के लिए बैश स्क्रिप्ट निष्पादित करते समय लाइन नंबर कैसे दिखाया जाएLINENO

कुछ और जोड़ना है?

ज़रूर। आप इसकी आवश्यकता क्यों है? आप इसके साथ कैसे काम करते हैं? इससे आप क्या कर सकते हैं? क्या यह सरल दृष्टिकोण वास्तव में पर्याप्त या उपयोगी है? आप इस सब के साथ छेड़छाड़ क्यों करना चाहते हैं?

अधिक जानना चाहते हैं? डिबगिंग पर प्रतिबिंब पढ़ें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.