यहां एक संभावित समाधान है, लेकिन यह सभी कमांडों को फंसाएगा, न केवल उन प्रॉम्प्ट के माध्यम से दर्ज किया गया है (इसलिए स्क्रिप्ट में कमांड भी फंस जाएगा)। जो आप चाहते हैं उसे प्राप्त करने के लिए आपको इसे संशोधित करना पड़ सकता है।
सबसे पहले, shopt extdebug
विकल्प सेट करें ।
से मैनुअल :
यदि सेट किया जाता है, तो डिबगर्स द्वारा उपयोग किए जाने का इरादा सक्षम है:
1--निर्मित बिल्डिन को देखें -F विकल्प (बैश बिल्डिंस देखें) एक तर्क के रूप में दिए गए प्रत्येक फ़ंक्शन नाम के अनुरूप स्रोत फ़ाइल नाम और लाइन नंबर प्रदर्शित करता है।
2- यदि DEBUG ट्रैप द्वारा चलाया गया कमांड नॉन-जीरो वैल्यू देता है, तो अगला कमांड स्किप हो जाता है और निष्पादित नहीं होता है।
3- यदि DEBUG ट्रैप द्वारा चलाए जाने वाला कमांड 2 का मान लौटाता है, और शेल सबरूटीन (शेल फ़ंक्शन या शेल स्क्रिप्ट को निष्पादित करता है) या स्रोत बिल्डिंस द्वारा निष्पादित किया जाता है, तो वापस लौटने के लिए कॉल को सिम्युलेटेड किया जाता है।
4- BASH_ARGC और BASH_ARGV को उनके विवरणों में वर्णित के रूप में अपडेट किया गया है (बैश वेरिएबल्स देखें)।
5- फ़ंक्शन ट्रेसिंग को सक्षम किया गया है: कमांड प्रतिस्थापन, शेल फ़ंक्शंस, और इनहेल्ड किए गए कमांड (कमांड) से DEBUG और RETURN जाल प्राप्त होते हैं।
6- त्रुटि अनुरेखण सक्षम है: कमांड प्रतिस्थापन, शेल फ़ंक्शंस, और (कमांड) इनवॉइस के साथ ERR ट्रैप को इनहेरिट किया गया।
(जोर मेरा)
उपयोगकर्ता द्वारा दर्ज किए गए कमांड के निष्पादन को रद्द करने और इसके बजाय अपने कस्टम फ़ंक्शन को कॉल करने के लिए आपको इस आदेश की आवश्यकता है। यदि यह सेट नहीं होता है, तो बैश आपके कस्टम फ़ंक्शन को कॉल करेगा और उपयोगकर्ता की कमांड निष्पादित करेगा।
फिर, बैश वैरिएबल विस्तार को रोकने के लिए अपने जाल को लिखने के लिए सरल उद्धरणों का उपयोग करें:
trap 'caller >/dev/null || xxx $BASH_COMMAND' DEBUG
अब, यदि आपका xxx
फ़ंक्शन गैर-शून्य मान (जैसे 1
) लौटाता है , तो उपयोगकर्ता का आदेश निष्पादित नहीं किया जाएगा।
यहाँ एक पूर्ण उदाहरण है:
$ shopt -s extdebug
$ xxx() { if [ "$1" = 'sudo' ]; then echo "No sudo, please.";return 1; fi }
$ trap 'caller >/dev/null || xxx $BASH_COMMAND' DEBUG
$ ls
foo bar
$ sudo ls
No sudo, please.
इस उदाहरण में, xxx
जांचें कि क्या कमांड का पहला शब्द है sudo
, और यदि ऐसा संदेश प्रिंट करता है और कमांड को रद्द करता है। आप xxx
उपयोग करके संपूर्ण उपयोगकर्ता आदेश प्राप्त कर सकते हैं "$*"
।