एक समान प्रश्न है जो 'रैपिंग' परिदृश्य से संबंधित है, जहां आप उदाहरण cdके लिए एक कमांड के साथ बदलना चाहते हैं जो बिलिन को कॉल करता है cd।
हालाँकि, शेलशॉक एट अल के प्रकाश में और यह जानते हुए कि पर्यावरण से कार्यों को आयात करता है, मैंने कुछ परीक्षण किए हैं और मैं cdअपनी स्क्रिप्ट से बेसिन को सुरक्षित रूप से कॉल करने का कोई तरीका नहीं खोज सकता ।
इस पर विचार करो
cd() { echo "muahaha"; }
export -f cd
इस वातावरण में उपयोग की जाने वाली कोई भी स्क्रिप्ट cdटूट जाएगी (किसी चीज़ के प्रभाव पर विचार करें cd dir && rm -rf .)।
कमांड के प्रकार की जांच करने के लिए कमांड हैं (आसानी से कहा जाता है type) और फ़ंक्शन ( builtinऔर command) के बजाय बिलिन संस्करण को निष्पादित करने के लिए कमांड । लेकिन, लो और निहारना, इन कार्यों के रूप में अच्छी तरह से उपयोग करके ओवरराइड किया जा सकता है
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
निम्नलिखित प्राप्त करेंगे:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
क्या बेसिन कमांड का उपयोग करने के लिए सुरक्षित रूप से बैश करने का कोई तरीका है, या कम से कम यह पता लगाने के लिए कि कमांड पूरे वातावरण को साफ किए बिना, एक बेसिन नहीं है?
मुझे एहसास है कि अगर कोई आपके पर्यावरण को नियंत्रित करता है, तो आप वैसे भी खराब कर सकते हैं, लेकिन कम से कम उपनामों के लिए आपको उपनाम डालने \से पहले कॉल न करने का विकल्प मिला है।
envएक फ़ंक्शन के रूप में भी पुनर्परिभाषित नहीं किया जाता है। यह भयानक है। मैंने पहले सोचा था कि विशेष वर्ण मदद करेंगे - पूर्ण पथ के साथ कॉल करना /, जिसमें .स्रोत का उपयोग करना शामिल है , और इसी तरह। लेकिन उन का उपयोग फ़ंक्शन नामों के लिए भी किया जा सकता है! आप अपने इच्छित किसी भी फ़ंक्शन को फिर से परिभाषित कर सकते हैं, लेकिन मूल कमांड को कॉल करने के लिए इसे वापस पाना मुश्किल है।
#/bin/shयदि यह डिफ़ॉल्ट इंटरैक्टिव शेल नहीं है।
envइस तरह से पहले कमांड का उपयोग करके अपनी स्क्रिप्ट चला सकते हैं :env -i <SCRIPT.sh>