मैं कैसे परेशान हो सकता हूं या बैश फ़ंक्शन से छुटकारा पा सकता हूं?


33

यदि आप बैश में एक वातावरण चर सेट या निर्यात करते हैं, तो आप इसे परेशान कर सकते हैं। यदि आप बैश में एक उपनाम सेट करते हैं, तो आप इसे खोल सकते हैं। लेकिन इसमें कोई कमी नहीं है

उदाहरण के लिए, यह (तुच्छ) बैश फ़ंक्शन पर विचार करें, एक .bash_aliases फ़ाइल में सेट करें और शेल आरंभीकरण पर पढ़ें।

function foo () { echo "bar" ; }

मैं अपने वर्तमान शेल से इस फ़ंक्शन की परिभाषा कैसे स्पष्ट कर सकता हूं?
(आरंभिक फ़ाइलों को बदलना या शेल को पुनः आरंभ करना गिनती नहीं है।)


कहा जा रहा है कि सभी, unfunctionएक कमांड के लिए एक अच्छा नाम होगा :-)
जॉय

@ जोहान्स रोसेल : zsh के पास है।
क्रिस जॉन्सन

एचएम, वास्तव में। फिर भी, मुझे लगता है कि यह सब थोड़ा और अधिक सहज और सुसंगत के साथ निपटने के लिए PowerShell का तरीका :-)
जॉय

जवाबों:


50

सेट नहीं निर्मित आदेश एक विकल्प लेता है, -fस्थित हटाएं कार्यों के लिए:

unset -f foo

बैश मैनपेज में अनसेट एंट्री का फॉर्म :

यदि -f निर्दिष्ट किया जाता है, तो प्रत्येक नाम शेल फ़ंक्शन को संदर्भित करता है, और फ़ंक्शन परिभाषा हटा दी जाती है।

नोट: -fकेवल वास्तव में आवश्यक है यदि समान नाम वाला कोई चर मौजूद है। यदि आपके पास नाम का एक चर भी नहीं है foo, तो unset fooफ़ंक्शन को हटा देगा।


बस यही याद आ रहा था। मैंने पाया था -fमें पैरामीटर निर्यात लेकिन यह में नहीं मिला था सेट नहीं । धन्यवाद।
क्वैक

2
@XavierStuvw: unsetएक बाहरी कमांड नहीं है, यह शेल का हिस्सा है ( इस मामले में बैश ); कोशिश करें man bashऔर प्रवेश पाएं unset(प्रबंधन काफी बड़ा है, अनुभाग के unsetअंतर्गत है Shell Builtin Commands)।
क्रिस जॉन्सन

4

देखें help unset:

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

वहाँ न तो है unset --helpऔर न ही man unsetदुर्भाग्य से।


4
ऐसा नहीं है man unsetक्योंकि यह एक अंतर्निहित कमांड है और इसके बजाय अंतर्निहित कमांड के लिए है help। कुछ अंतर्निहित कमांड के लिए यह एक बाहरी निष्पादन योग्य भी मौजूद है। संदेह के मामले में प्रयास करें जैसे type mycommnad। उदाहरण के लिए type unsetऔर यह आपको जवाब देगा unset is a shell builtin। यदि आप यह जानना चाहते हैं कि क्या यह निष्पादन योग्य भी मौजूद है, तो which echoएक और प्रयास (एक अन्य buikt-in) करें और यह कहेगा कि यह कहाँ है। --option_longनिष्पादन आदेश की खासियत है। कोशिश करो echo --helpऔर /bin/echo --help:-)
हस्तुर

@Hastur अपनी पूंछ को संपादित करके अपनी टिप्पणी को उत्तर में जोड़ने के लिए स्वतंत्र महसूस करें। यदि समीक्षक इसे मंजूरी देते हैं, तो आपको 2 अंक दिए जाएंगे।
XavierStuvw

1
... विचार जेवियर के लिए धन्यवाद: यह आपके लिए जवाब पूरा करने के लिए अधिक था; मुझे लगता है कि आप चूक गए थे कि यह एक अंतर्निहित कमांड थी और उनके लिए आपको helpइसके बजाय उपयोग करना होगा man। (वास्तव में सच नहीं है क्योंकि आप उन्हें man bashअध्याय शेल बिल्डिंग्स में या सीधे साथ पाते हैं man BASH-BUILTINS...)। यह आरामदायक है कि एक बैश शेल के तहत आप बस मांग सकते हैं helpऔर आपको अंतर्निहित कमांड की सूची प्राप्त होगी :-)। (कोशिश help helpऔर man manभी)।
हस्त्तूर

1
@Hastur आप सभी पाठकों के लाभ के लिए अच्छी तरह से उत्तर दे सकते हैं। तब हम छोटी-छोटी अव्यवस्थाओं की अच्छी लकीर बनाने के लिए टिप्पणियों को हटा सकते हैं।
XavierStuvw

0

मैं हाल ही में nvmइसे पूरी तरह से अनइंस्टॉल और पुनर्स्थापित करना चाहता था , और इसके किसी भी वातावरण से छुटकारा चाहता था । बाहर है कि यह से छुटकारा पाने की वजह से ज्यादा नहीं लगता है बदल जाता है nvmभाग में खोल कार्यों बहुत सारी है कि के माध्यम से अपने खोल में sourced रहे हैं के रूप में कार्यान्वित किया जाता है .bash_profileया .bashrc, या जहाँ भी आप उन सोर्सिंग आदेशों यह जब आप पहली बार यह स्थापित करने के लिए तुमसे कहा था जोड़ा।

पहले which nvmसे ही स्पष्ट रूप से कुछ भी नहीं लौटने से चकित nvmकमान और अन्य अभी भी पाए जा रहे थे, मैंने अंततः declare -Fइसके माध्यम से पता लगाया कि यह शेल फ़ंक्शन का एक गुच्छा है। मैं केवल शेल को मारना नहीं चाहता था और एक नया शुरू करना चाहता था (यहां प्रासंगिक कारणों के लिए नहीं), इसलिए मैंने nvmइसके साथ कार्य समाप्त कर दिया :

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

उस पर कुछ बदलाव किसी के लिए उपयोगी हो सकते हैं जो किसी भी कारण से कुछ इसी तरह करना चाहते हैं और एक नए खोल को फिर से शुरू नहीं कर सकते हैं या नहीं करना चाहते हैं।

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