2010-06-16 11 views
22

क्या कोई भी चर है जिसमें bsh में निष्पादित किया गया है जिसमें .sh फ़ाइल निष्पादित है?
लाइन संख्या भी बहुत अच्छी होगी।`__FILE__` के समतुल्य,` __LINE__` में bash

मैं इस तरह के रूप त्रुटि संदेश में उपयोग करना चाहते हैं:
गूंज "त्रुटि: [$ फ़ाइल: एल $ लाइन] $ somefile नहीं मिला"

उत्तर

20
#!/bin/bash 

echo $LINENO 
echo `basename $0` 

वर्तमान फ़ाइल के लिए वर्तमान पंक्ति संख्या $0 के लिए $LINENO। मैंने यह सुनिश्चित करने के लिए basename का उपयोग किया है कि आपको केवल फ़ाइल का नाम मिलता है, न कि पथ।

अद्यतन:

#!/bin/bash 

MY_NAME=`basename $0` 

function ouch { 
    echo "Fail @ [${MY_NAME}:${1}]" 
    exit 1 
} 

ouch $LINENO 

यदि आप समारोह दृष्टिकोण का उपयोग किसी और आप समारोह परिभाषा की लाइन मिल जाएगा एक पैरामीटर के रूप लाइन पारित करने के लिए की है।

+3

'basename $ 0' (कोई 'echo' आवश्यक नहीं है) –

+3

ध्यान दें कि यदि आप स्क्रिप्ट को स्रोत करते हैं, तो' बेसनाम $ 0' मूल स्क्रिप्ट वापस कर देगा। – scribu

+2

और यह स्क्रिप्ट लोड लोड शेल (~/.bashrc, /etc/profile.d/*) में अच्छी तरह से काम नहीं कर रहा है। "BASH_SOURCE" और "BASH_LINENO" बहुत बेहतर हैं, althought वे bashisms हैं। – pevik

2

चर $ 0 आप को क्रियान्वित करने खोल के नाम दे देंगे बैश में लिपि।

6

तुम बस मैं "BASH_SOURCE" और "BASH_LINENO" में निर्मित सरणियों बहुत उपयोगी पाते हैं

echo $LINENO 
echo $(basename $0) 
+0

'बेसनाम $ 0' (कोई' echo' आवश्यक नहीं है) –

15

की जरूरत है:

$ cat xx 
#!/bin/bash 

_ERR_HDR_FMT="%.23s %s[%s]: " 
_ERR_MSG_FMT="${_ERR_HDR_FMT}%s\n" 

error_msg() { 
    printf "$_ERR_MSG_FMT" $(date +%F.%T.%N) ${BASH_SOURCE[1]##*/} ${BASH_LINENO[0]} "${@}" 
} 

error_msg "here" 


error_msg "and here" 

लागू xx पैदावार

2010-06-16.15:33:13.069 xx[11]: here 
2010-06-16.15:33:13.073 xx[14]: and here 
+0

मैं भी वर्णन किया है जैसा कि BASH_ * चर का उपयोग करना पसंद करते हैं। बैश स्क्रिप्ट्स को डीबग करने के तरीके पर एक अच्छा लेख दिया गया है जिसे मैंने अतीत में संदर्भित किया है: http://aymanh.com/how-debug-bash-scripts –

+0

यह सुंदर है –