एक समान प्रश्न है जो 'रैपिंग' परिदृश्य से संबंधित है, जहां आप उदाहरण 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>