सिस्टम कमांड के समान उपयोगकर्ता नाम के साथ कार्य को ओवरराइड करना


14

यह फ़ंक्शन मेरे एक उपयोगकर्ता के ~ / .bashrc में मौजूद है:

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

उपयोगकर्ताओं को चलाने के लिए आवश्यक मेरी ksh स्क्रिप्ट में, मेरे पास इस तरह की एक पंक्ति है:

[[ "$KEEP" = "" ]] && \rm $FILE

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

मुझे यह सुपरयूज़र प्रश्न प्रश्न और प्रतिक्रिया मिला, लेकिन संकल्प केवल एक अंतर्निहित फ़ंक्शन पर लागू होता है, न कि सिस्टम कमांड पर।

आरएम कमांड को लागू करने से सबसे अच्छा क्या है, और एक उपनाम या फ़ंक्शन नहीं है? क्या मुझे rm और पूरे सिस्टम कमांड को निर्दिष्ट करना चाहिए जिसे मैं सुनिश्चित करना चाहता हूं कि इसे सही तरीके से निष्पादित किया जाए? क्या कोई बेहतर तरीका है?

जवाबों:


13

आप commandसामान्य बैश फ़ंक्शन लुकअप को दरकिनार करने के लिए उपयोग कर सकते हैं ।

command rm

गैर-विनाशकारी उदाहरण:

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

वैकल्पिक रूप से, इसका उपयोग करके कॉल करें env(पहले प्रोग्राम को दिए गए नाम के साथ $PATHया पूर्ण पथ निर्दिष्ट करके)।

/usr/bin/env rm
/bin/rm

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

@acm जैसा कि मैंने लिखा है, आप envरूट पर भी जा सकते हैं । इसके अतिरिक्त, आप प्रत्येक उपकरण के स्थान को एक बार निर्धारित कर सकते हैं और उसे एक चर में रख सकते हैं, जैसे RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;। आप यह भी बदल सकते हैं कि आपकी स्क्रिप्ट कैसे निष्पादित की जाती है। आमतौर पर, फ़ंक्शंस और उपनामों को विरासत में नहीं मिलता है, अन्यथा वे हर समय स्क्रिप्ट को तोड़ देंगे।
डैनियल बेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.