बैश preexecute


1

मैं बैश कमांड रैपर लिखने की कोशिश कर रहा हूं, जो मक्खी पर पैच बैश करंट कमांड होगा। लेकिन मुझे समस्या का सामना करना पड़ा। जैसा कि मैं एक अच्छा शेल उपयोगकर्ता नहीं हूं, मैं स्ट्रिंग में चर असाइनमेंट की सही अभिव्यक्ति नहीं लिख सकता। नीचे देखें:

मैं इस के माध्यम से preexecute के लिए जाल सेट कर रहा हूँ:

 alex@bender:~$ trap "caller >/dev/null ||  xxx \"\${BASH_COMMAND}"\"  DEBUG;

मैं परिवर्तनशील BASH_COMMAND चाहता हूं , BASH_COMMAND = जैसा कुछ करें xxx ${BASH_COMMAND}लेकिन मुझे नहीं पता, मुझे इस स्ट्रिंग में चर से बचने की आवश्यकता कैसे है

नोट: xxx - मेरा कस्टम फ़ंक्शन, जिसे कमांड वैल्यू शब्द के अंत में स्थित होने पर, कुछ मान वापस करना होगा

function xxx(){
# find by grep, if teststr in the end
`echo "$1" | grep "teststr$" >/dev/null`;
# if true ==> do
if [ "$?" == "0" ]; then
    # cut last 6 chars (len('teststr')==6)
    var=`echo "$1" | sed 's/......$//'`;
    echo "$var";
fi    }

मैं यह कैसे कर सकते हैं?

alex@bender:~$ trap "caller >/dev/null || ${BASH_COMMAND}=`xxx $BASH_COMMAND`"  DEBUG;

मुझे विश्वास नहीं है कि इस तरह से बैश इनपुट को बदलना संभव है। आप इसे एक रीडलाइन हुक के साथ करने में सक्षम हो सकते हैं, हालांकि। यह जानना उपयोगी होगा कि आप वास्तव में क्या हासिल करना चाहते हैं क्योंकि ऐसा करने का एक और तरीका हो सकता है।
रिसी

जवाबों:


2

यहां एक संभावित समाधान है, लेकिन यह सभी कमांडों को फंसाएगा, न केवल उन प्रॉम्प्ट के माध्यम से दर्ज किया गया है (इसलिए स्क्रिप्ट में कमांड भी फंस जाएगा)। जो आप चाहते हैं उसे प्राप्त करने के लिए आपको इसे संशोधित करना पड़ सकता है।

सबसे पहले, 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उपयोग करके संपूर्ण उपयोगकर्ता आदेश प्राप्त कर सकते हैं "$*"

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