उबंटू में "कमांड नहीं मिला" हैंडलर में हुक


9

मैं हैंडलर में हुक लगाना चाहता हूं जो नहीं मिला

wim@SDFA100461C:~$ thing
No command 'thing' found, did you mean:
 Command 'tping' from package 'lam-runtime' (universe)
 Command 'thin' from package 'thin' (universe)
thing: command not found

मैं अपनी स्क्रिप्ट के साथ इस व्यवहार को ओवरराइड करना चाहता हूं।

विशेष रूप से, मैं जांच करना चाहता हूं कि क्या कमांड आउटपुट में मौजूद है lsvirtualenv -b, और यदि मैं उस virtualenv को सक्रिय करना चाहता हूं।

मुझे कहां से हैकिंग शुरू करनी चाहिए?


1
यह मदद कर सकता है: askubuntu.com/a/73282/10127
ग्लेन जैकमैन

जवाबों:


8

सामान्य रूप में

लिनक्स जर्नल एक बहुत अच्छा लेख है:

बैश के मैन पेज से:

... PATH में निर्देशिकाओं की पूरी खोज केवल तभी की जाती है जब कमांड को हैश तालिका में नहीं मिला है। यदि खोज असफल है, तो शेल एक परिभाषित शेल फ़ंक्शन के लिए खोज करता है, जिसका नाम command_not_found_handle है। यदि वह फ़ंक्शन मौजूद है, तो इसे मूल कमांड और मूल कमांड के तर्कों के साथ इसके तर्कों के रूप में लागू किया जाता है, और फ़ंक्शन की निकास स्थिति शेल की निकास स्थिति बन जाती है। यदि वह फ़ंक्शन परिभाषित नहीं है, तो शेल एक त्रुटि संदेश प्रिंट करता है और 127 की निकास स्थिति देता है।

तथा

एक त्वरित grep in / etc की खोज की जहां यह हो रहा था। फ़ंक्शन स्वयं / etc / bash_command_not_found में है और वह फ़ंक्शन आपके bash सत्र में /etc/bash.bashrc के माध्यम से शामिल होता है (यदि यह मौजूद है)।

उबंटू 14.04

अनुभवजन्य साक्ष्य बताते हैं कि उबंटू 14.04 इंस्टॉलेशन पर, फ़ाइल / etc / bash_command_not_found मौजूद नहीं है, हालांकि, सही फ़ाइल एक पायथन स्क्रिप्ट है, जो / usr / lib / कमांड-नहीं-पाया पर स्थित है


1
इसने मुझे सही रास्ते पर स्थापित किया, लेकिन वास्तविक कार्यक्रम एक अजगर स्क्रिप्ट पर स्थित था /usr/lib/command-not-found । मेरे Ubuntu 14.04 स्थापना पर, फ़ाइल /etc/bash_command_not_foundमौजूद नहीं है।
wim

धन्यवाद, मैंने इसे भविष्य के दर्शकों के लिए अपने जवाब में जोड़ दिया है
एंड्रयू स्टब्स ने

1

इसके लिए bash, इसका व्यवहार शेल फ़ंक्शन द्वारा संचालित होता है command_not_found_handle(देखें man bash, COMMAND EXECUTION के तहत)।

यह देखने के लिए कि उस फ़ंक्शन द्वारा किस व्यवहार को परिभाषित किया गया है, आप जारी कर सकते हैं:

declare -p -f command_not_found_handle

आप command_not_found_handleफ़ंक्शन को पुनर्परिभाषित करने के लिए किस प्रोग्राम का उपयोग कर सकते हैं ।

Ubuntu 14.04 LTS में, ऐसा लगता है कि डिफ़ॉल्ट व्यवहार सीधे में परिभाषित किया गया है /etc/bash.bashrc:

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
            if [ -x /usr/lib/command-not-found ]; then
               /usr/lib/command-not-found -- "$1"
               return $?
            elif [ -x /usr/share/command-not-found/command-not-found ]; then
               /usr/share/command-not-found/command-not-found -- "$1"
               return $?
            else
               printf "%s: command not found\n" "$1" >&2
               return 127
            fi
    }
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.