2012-11-02 9 views
48

किसी को भी पता है कि अगर हम बिना यह मुद्रित किया जा रहा बैश में set +x कह सकते हैं:बैश सेट + x के बिना यह मुद्रित किया जा रहा

set -x 
command 
set +x 

निशान

+ command 
+ set +x 

लेकिन यह सिर्फ प्रिंट चाहिए

+ command 

बैश संस्करण 4.1.10 (4) है। यह मुझे कुछ समय के लिए परेशान कर रहा है - उत्पादन बेकार set +x लाइनों के साथ घिरा हुआ है, जिससे ट्रेस सुविधा उतनी उपयोगी नहीं हो सकती है जितनी हो सकती है।

+0

यह आपके सवाल का जवाब नहीं है, लेकिन जब आप अपने स्क्रिप्ट चलाने क्यों नहीं: script.sh 2 '> & 1 | grep -v 'set + x' ' – cdarke

उत्तर

28

आप एक सबहेल का उपयोग कर सकते हैं। subshell बाहर निकलने पर, x के लिए सेटिंग खो जाएगा:

(set -x ; command) 
+0

अच्छा, धन्यवाद ... अच्छा बिंदु। दरअसल मैं "उप-शेल चाल" के बारे में जानता हूं। मुझे उम्मीद थी कि इससे भी आसान हो सकता है। इसमें कोड जटिलता और कम पठनीय बनाने के लिए कोड में पर्याप्त परिवर्तन शामिल हैं। आईएमएचओ जो सेट + एक्स लाइनों के साथ रहने से भी बदतर होगा ... –

+0

मुझे नहीं लगता कि कैसे '(set -x \ n कमांड \ n) 'सेट -x \ n कमांड \ n सेट + से भी बदतर है x'। – chepner

+2

@chepner: आप चर सेट नहीं कर सकते हैं। – choroba

77

मैं एक ही समस्या थी, और मैं एक समाधान है कि एक subshell उपयोग नहीं करता है खोजने के लिए कर रहा था:

set -x 
command 
{ set +x; } 2>/dev/null 
+6

ग्रेट उत्तर, सिर्फ एक नोट: आदेश के बाद अर्धविराम के बिना यह काम नहीं करेगा; और अर्धविराम के साथ लेकिन ब्रेसिज़ के बिना रिक्त स्थान के, एक वाक्यविन्यास त्रुटि उठाई जाएगी। – sdaau

+5

यह बाहर निकलने की स्थिति शून्य है। –

+0

@ गर्थकिड निकास स्थिति हर सफल कमांड के साथ शून्य हो जाती है। 'सेट + एक्स' इतनी सफल कमांड –

6

मैं अभी हाल ही में इस के लिए एक समाधान हैक की गई जब मैं इसके साथ नाराज हो गया:

shopt -s expand_aliases 
_xtrace() { 
    case $1 in 
     on) set -x ;; 
     off) set +x ;; 
    esac 
} 
alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<' 

यह आपको सक्षम और निम्नलिखित, मैं जहां लॉगिन कर रहा हूं कि कैसे तर्क असाइन कर रहे हैं के रूप में xtrace अक्षम कर सकते हैं चर के एड:

xtrace on 
ARG1=$1 
ARG2=$2 
xtrace off 

और तुम उत्पादन ऐसा दिखता है जैसे मिलती है:

$ ./script.sh one two 
+ ARG1=one 
+ ARG2=two 
+0

चालाक चाल है (हालांकि आपको '/ dev/stdin' भाग की आवश्यकता नहीं है)। चेतावनी यह है कि लिपियों में उपनाम विस्तार को चालू करने से अवांछित दुष्प्रभाव हो सकते हैं। – mklement0

+0

आप सही हैं। मैंने अनावश्यक '/ dev/stdin' को हटाने के लिए उत्तर संपादित किया है। मुझे किसी भी विशिष्ट साइड इफेक्ट्स से अवगत नहीं है, क्योंकि गैर-इंटरैक्टिव वातावरण को एलियास को परिभाषित करने वाली किसी भी फाइल को लोड नहीं करना चाहिए। क्या दुष्प्रभाव हो सकते हैं? – user108471

+1

यह एक अच्छा मुद्दा है - मैं भूल गया कि उपनाम विरासत में नहीं हैं, इसलिए जोखिम मैंने सोचा जितना छोटा है (अनुमानतः, आपकी लिपि तीसरे पक्ष के कोड को सोर्सिंग कर सकती है जो उपनाम परिभाषित करने के लिए होती है, लेकिन मैं मानता हूं कि शायद असली नहीं है - चिंता चिंता)। +1 – mklement0

संबंधित मुद्दे