साथ bash
4.1 और उसके बाद, आप कर सकते हैं
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(यह भी काम करता है जब के bash
रूप में लागू किया जाता है sh
)।
असल में, हम आउटपुट को फाइल डिस्क्रिप्टर 7 के बजाय 2 के डिफॉल्ट पर bash
आउटपुट करने के लिए कह रहे हैं xtrace
, और उस फाइल डिस्क्रिप्टर को रीडायरेक्ट करते हैं /dev/null
। एफडी संख्या मनमानी है। 2 से ऊपर एक fd का उपयोग करें जो अन्यथा आपकी स्क्रिप्ट में उपयोग नहीं किया गया है। यदि आप जिस शेल में इस कमांड में प्रवेश कर रहे हैं वह है bash
या yash
, आप 9 से ऊपर की संख्या का उपयोग भी कर सकते हैं (हालांकि यदि आप फ़ाइल डिस्क्रिप्टर शेल द्वारा आंतरिक रूप से उपयोग किया जाता है तो आप समस्याओं में चल सकते हैं)।
यदि आप उस bash
स्क्रिप्ट को कॉल कर रहे हैं zsh
, तो आप यह भी कर सकते हैं:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
चर के लिए स्वचालित रूप से 9 से ऊपर पहले मुफ्त एफडी सौंपा जाना चाहिए।
के पुराने संस्करणों के लिए bash
, एक और विकल्प है, अगर xtrace
साथ चालू है set -x
(के रूप में करने का विरोध किया #! /bin/bash -x
या set -o xtrace
) को फिर से परिभाषित करने के लिए किया जाएगा set
एक निर्यात समारोह जब से पारित कर दिया है कि कुछ नहीं करता है के रूप में -x
(अगर यह (या किसी अन्य यद्यपि कि स्क्रिप्ट टूट जाएगा bash
स्क्रिप्ट यह आह्वान) set
स्थितीय मापदंडों को निर्धारित करने के लिए उपयोग किया जाता है)।
पसंद:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
एक अन्य विकल्प एक $BASH_ENV
फ़ाइल में एक डीबग जाल जोड़ने के लिए है जो set +x
हर कमांड से पहले होता है ।
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
जब set -x
उप-शेल में किया जाता है तो वह काम नहीं करेगा ।
जैसा कि @ilkkachu ने कहा, बशर्ते कि आपने फ़ाइल सिस्टम पर किसी भी फ़ोल्डर को लिखने की अनुमति दी है, आपको कम से कम स्क्रिप्ट की एक प्रतिलिपि बनाने और इसे संपादित करने में सक्षम होना चाहिए।
यदि कहीं भी आप स्क्रिप्ट की एक प्रति लिख सकते हैं, या यदि हर बार नई कॉपी बनाने और संपादित करने के लिए यह सुविधाजनक नहीं है, तो मूल स्क्रिप्ट के लिए एक अपडेट है, आप अभी भी कर सकते हैं:
bash <(sed 's/set -x/set +x/g' ./script.bash)
वह (और कॉपी एप्रोच) ठीक से काम नहीं कर सकता है अगर स्क्रिप्ट कुछ भी $0
या विशेष चर के साथ कल्पना करती है जैसे $BASH_SOURCE
(जैसे कि वे फाइलें जो स्वयं स्क्रिप्ट के स्थान के सापेक्ष हैं), इसलिए आपको कुछ और संपादन करने की आवश्यकता हो सकती है जैसे $0
स्क्रिप्ट के रास्ते से बदलें ...
./script 2>some_file